/ Hex Artifact Content
Login

Artifact 8fa6341b74ab70a28001e4ed4bc5ba14ce1401a6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 31 30 20 32 30 30 37 2f 30  c,v 1.410 2007/0
0190: 38 2f 32 33 20 30 32 3a 34 37 3a 35 33 20 64 72  8/23 02:47:53 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
0380: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0390: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
03a0: 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  ce=0;  /* True t
03b0: 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67  o enable tracing
03c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69   */.#endif....#i
03d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
03e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
03f0: 2a 0a 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69  *.** A flag to i
0400: 6e 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20  ndicate whether 
0410: 6f 72 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61  or not shared ca
0420: 63 68 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  che is enabled. 
0430: 20 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74   Also,.** a list
0440: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0450: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0460: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0470: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0480: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0490: 65 20 76 61 72 69 61 62 6c 65 73 20 68 61 76 65  e variables have
04a0: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
04b0: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
04c0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04d0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04e0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 73 65 20  to access these 
04f0: 76 61 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20  variables so we 
0500: 6d 61 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f  make them.** glo
0510: 62 61 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69  bal for test bui
0520: 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  lds..*/.#ifdef S
0530: 51 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61  QLITE_TEST.BtSha
0540: 72 65 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72  red *sqlite3Shar
0550: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
0560: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72  .int sqlite3Shar
0570: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0580: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
0590: 20 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74   BtShared *sqlit
05a0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05b0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  t = 0;.static in
05c0: 74 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  t sqlite3SharedC
05d0: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b  acheEnabled = 0;
05e0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f  .#endif.#endif /
05f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
0600: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
0610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0620: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0630: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
0640: 64 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72  disable the shar
0650: 65 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68  ed pager and sch
0660: 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a  ema features..**
0670: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0680: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f   has no effect o
0690: 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
06a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
06b0: 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63  .** The shared c
06c0: 61 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66  ache setting eff
06d0: 65 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65  ects only future
06e0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
06f0: 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c  ite3_open(), sql
0700: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f  ite3_open16(), o
0710: 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
0720: 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  2()..*/.int sqli
0730: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
0740: 64 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62  d_cache(int enab
0750: 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68  le){.  sqlite3Sh
0760: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
0770: 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74   = enable;.  ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
0790: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
07a0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
07b0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
07c0: 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
07d0: 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c 42 74 43  (Btree*,Pgno,BtC
07e0: 75 72 73 6f 72 2a 29 3b 0a 0a 0a 23 69 66 64 65  ursor*);...#ifde
07f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0800: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
0810: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
0820: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
0830: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
0840: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
0850: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
09c0: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
09d0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
09e0: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
09f0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0a00: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
0a10: 54 61 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66  Tables(a).#endif
0a20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0a30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0a40: 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  HE./*.** Query t
0a50: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
0a60: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
0a70: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
0a80: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
0a90: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
0aa0: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
0ab0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0ac0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
0ad0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
0ae0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
0af0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
0b00: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
0b10: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
0b20: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
0b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
0b40: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
0b50: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
0b60: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
0b70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
0b80: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
0b90: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
0ba0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
0bb0: 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  exHeld(pBt->mute
0bc0: 78 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  x) );.  .  /* Th
0bd0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
0be0: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
0bf0: 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  e is not enabled
0c00: 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   */.  if( !p->sh
0c10: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65  arable ){.    re
0c20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0c30: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28    }..  /* This (
0c40: 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54  along with lockT
0c50: 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65  able()) is where
0c60: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0c70: 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a  tted flag is.  *
0c80: 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66  * dealt with. If
0c90: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71   the caller is q
0ca0: 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65  uerying for a re
0cb0: 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ad-lock and the 
0cc0: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74  flag is.  ** set
0cd0: 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74  , it is uncondit
0ce0: 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20  ionally granted 
0cf0: 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  - even if there 
0d00: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
0d10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
0d20: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
0d30: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
0d40: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0d50: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
0d60: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
0d70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
0d80: 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c  unction lockTabl
0d90: 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c  e(), if a read-l
0da0: 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20  ock is demanded 
0db0: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65  and the .  ** Re
0dc0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0dd0: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e  ag is set, no en
0de0: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
0df0: 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a  the locks list .
0e00: 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70    ** (BtShared.p
0e10: 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Lock)..  **.  **
0e20: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49   To summarize: I
0e30: 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  f the ReadUncomm
0e40: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0e50: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72  t, then read cur
0e60: 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  sors do.  ** not
0e70: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
0e80: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
0e90: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63  The locking proc
0ea0: 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a  edure for a .  *
0eb0: 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64  * write-cursor d
0ec0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a  oes not change..
0ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
0ee0: 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a  !p->pSqlite || .
0ef0: 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69      0==(p->pSqli
0f00: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
0f10: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
0f20: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
0f30: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
0f40: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
0f50: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
0f60: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
0f70: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
0f80: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
0f90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
0fa0: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
0fb0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
0fc0: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
0fd0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
0fe0: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
0ff0: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
1000: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1010: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
1020: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1040: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
1050: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1060: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1080: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1090: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
10a0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
10b0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
10c0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
10d0: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
10e0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
10f0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
1100: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
1110: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
1120: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
1130: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1140: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
1150: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
1160: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
1170: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c  _BUSY and.** SQL
1180: 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c  ITE_NOMEM may al
1190: 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  so be returned..
11a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
11b0: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
11c0: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
11d0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
11e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11f0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
1200: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
1210: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
1220: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1230: 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d 3e  eMutexHeld(pBt->
1240: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
1250: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1260: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
1270: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
1280: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
1290: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
12a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12b0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12c0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
12d0: 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
12e0: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
12f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61  .  /* If the rea
1300: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1310: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20  ag is set and a 
1320: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71  read-lock is req
1330: 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74  uested,.  ** ret
1340: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75  urn early withou
1350: 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72  t adding an entr
1360: 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  y to the BtShare
1370: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65  d.pLock list. Se
1380: 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69  e.  ** comment i
1390: 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79  n function query
13a0: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20  TableLock() for 
13b0: 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e  more info on han
13c0: 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  dling .  ** the 
13d0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
13e0: 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  flag..  */.  if(
13f0: 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74   .    (p->pSqlit
1400: 65 29 20 26 26 20 0a 20 20 20 20 28 70 2d 3e 70  e) && .    (p->p
1410: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51  Sqlite->flags&SQ
1420: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1430: 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28 65  tted) && .    (e
1440: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
1450: 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d   &&.    iTable!=
1460: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1470: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1480: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1490: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
14a0: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
14b0: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
14c0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
14d0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
14e0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
14f0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1500: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
1510: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
1520: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
1530: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
1540: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
1550: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1560: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1570: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
1580: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
1590: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
15a0: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
15b0: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
15c0: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
15d0: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
15e0: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
15f0: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
1600: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
1610: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
1620: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1630: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
1640: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1650: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1660: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1670: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
1680: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
1690: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
16a0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
16b0: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
16c0: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
16d0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
16e0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
16f0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
1700: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
1710: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
1720: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
1730: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
1740: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
1750: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
1760: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
1770: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
1780: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
1790: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
17a0: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
17b0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
17c0: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
17d0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
17e0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
17f0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
1800: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
1810: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
1820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1830: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
1840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1850: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
1860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1870: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
1880: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
1890: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
18a0: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
18b0: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
18c0: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
18d0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
18e0: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
18f0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
1900: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
1910: 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a   *p){.  BtLock *
1920: 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42  *ppIter = &p->pB
1930: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
1940: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1950: 65 4d 75 74 65 78 48 65 6c 64 28 70 2d 3e 70 42  eMutexHeld(p->pB
1960: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1970: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
1980: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
1990: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
19a0: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
19b0: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
19c0: 49 74 65 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  Iter;.    if( pL
19d0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
19e0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
19f0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
1a00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1a10: 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ee(pLock);.    }
1a20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74  else{.      ppIt
1a30: 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65  er = &pLock->pNe
1a40: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
1a50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a60: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1a70: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
1a80: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
1a90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
1aa0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
1ab0: 72 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65  rence */..#ifnde
1ac0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1ad0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76  CRBLOB./*.** Inv
1ae0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
1af0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1b00: 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20  ache for cursor 
1b10: 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  pCur, if any..*/
1b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
1b30: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1b40: 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70  ache(BtCursor *p
1b50: 43 75 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Cur){.  sqlite3_
1b60: 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
1b70: 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61  flow);.  pCur->a
1b80: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a  Overflow = 0;.}.
1b90: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
1ba0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1bb0: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
1bc0: 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  or all cursors o
1bd0: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  pened.** on the 
1be0: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
1bf0: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73  ucture pBt..*/.s
1c00: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
1c10: 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1c20: 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a  Cache(BtShared *
1c30: 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
1c40: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
1c50: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
1c60: 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  Held(pBt->mutex)
1c70: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
1c80: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1c90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1ca0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1cb0: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
1cc0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
1cd0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1ce0: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
1cf0: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
1d00: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1d10: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
1d20: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
1d30: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
1d40: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
1d50: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
1d60: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
1d70: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
1d80: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
1d90: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
1da0: 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74  IRESEEK..*/.stat
1db0: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
1dc0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
1dd0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
1de0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1df0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
1e00: 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20  ur->eState );.  
1e10: 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d  assert( 0==pCur-
1e20: 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  >pKey );.  asser
1e30: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
1e40: 75 74 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70  utexHeld(pCur->p
1e50: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  Btree->pBt->mute
1e60: 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  x) );..  rc = sq
1e70: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1e80: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
1e90: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
1ea0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
1eb0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
1ec0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
1ed0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
1ee0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
1ef0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
1f00: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
1f10: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
1f20: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
1f30: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
1f40: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
1f50: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
1f60: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
1f70: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
1f80: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
1f90: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
1fa0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
1fb0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
1fc0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1fd0: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
1fe0: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
1ff0: 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  y){.    void *pK
2000: 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ey = sqlite3_mal
2010: 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  loc(pCur->nKey);
2020: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
2030: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2040: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
2050: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
2060: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
2070: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2090: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
20a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20c0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
20d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
20f0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
2100: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50  ssert( !pCur->pP
2110: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  age->intKey || !
2120: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
2130: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2140: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
2150: 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
2160: 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  e);.    pCur->pP
2170: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  age = 0;.    pCu
2180: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2190: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
21a0: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
21b0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
21c0: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
21d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
21e0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
21f0: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  f all cursors ex
2200: 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65  cept pExcept ope
2210: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
2220: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  ** with root-pag
2230: 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79  e iRoot. Usually
2240: 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  , this is called
2250: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
2260: 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69  sor.** pExcept i
2270: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
2280: 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65   the table (Btre
2290: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
22a0: 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a  eeInsert())..*/.
22b0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
22c0: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
22d0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
22e0: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
22f0: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
2300: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
2310: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
2320: 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74  texHeld(pBt->mut
2330: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
2340: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
2350: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
2360: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
2370: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
2380: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
2390: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
23a0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
23b0: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
23c0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
23d0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
23e0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
23f0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
2400: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2420: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2430: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
2440: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
2450: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2460: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2470: 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
2480: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2490: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ur){.  assert( s
24a0: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
24b0: 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  Held(pCur->pBtre
24c0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
24d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
24e0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
24f0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
2500: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2510: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
2530: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2540: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
2550: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
2560: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
2570: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
2580: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2590: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
25a0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
25b0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
25c0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
25d0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
25e0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
25f0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
2600: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
2610: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
2620: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2630: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
2640: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
2650: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2660: 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ion()..**.** If 
2670: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2680: 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 64  ent argument - d
2690: 6f 53 65 65 6b 20 2d 20 69 73 20 66 61 6c 73 65  oSeek - is false
26a0: 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f  , then instead o
26b0: 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20  f .** returning 
26c0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
26d0: 27 73 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  's saved positio
26e0: 6e 2c 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73  n, any saved pos
26f0: 69 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ition is deleted
2700: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73  .** and the curs
2710: 6f 72 20 73 74 61 74 65 20 73 65 74 20 74 6f 20  or state set to 
2720: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a  CURSOR_INVALID..
2730: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2740: 72 65 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61  reeRestoreOrClea
2750: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2760: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2770: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
2780: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2790: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
27a0: 45 53 45 45 4b 20 29 3b 0a 23 69 66 6e 64 65 66  ESEEK );.#ifndef
27b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
27c0: 52 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75 72  RBLOB.  if( pCur
27d0: 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
27e0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
27f0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
2800: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75 72   }.#endif.  pCur
2810: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2820: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
2830: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2840: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
2850: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
2860: 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69  y, 0, &pCur->ski
2870: 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  p);.  if( rc==SQ
2880: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2890: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
28a0: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
28b0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
28c0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28d0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28e0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
28f0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2900: 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LID );.  }.  ret
2910: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
2920: 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ne restoreOrClea
2930: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2940: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
2950: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
2960: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
2970: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2980: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2990: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a  sorPosition(p) :
29a0: 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49   \.         SQLI
29b0: 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20  TE_OK)..#ifndef 
29c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
29d0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
29e0: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
29f0: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
2a00: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
2a10: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
2a20: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
2a30: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
2a40: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2a50: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
2a60: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
2a70: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
2a80: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
2a90: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
2aa0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
2ab0: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
2ac0: 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65  age, iPtrMap, re
2ad0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2ae0: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65  ite3BtreeMutexHe
2af0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2b00: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
2b10: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
2b20: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
2b30: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
2b40: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
2b50: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
2b60: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
2b70: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
2b80: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
2b90: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2ba0: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
2bb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
2bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
2bd0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
2be0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
2bf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2c00: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
2c10: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
2c20: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
2c30: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
2c40: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
2c50: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
2c60: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
2c70: 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72  pgno'..** An err
2c80: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2c90: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
2ca0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
2cb0: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
2cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cd0: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
2ce0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
2cf0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
2d00: 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50  o parent){.  DbP
2d10: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
2d20: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
2d30: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
2d40: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
2d50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
2d60: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
2d70: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
2d80: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2d90: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
2da0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
2db0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
2dc0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
2dd0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
2de0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2df0: 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
2e00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2e10: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
2e20: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
2e30: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
2e40: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
2e50: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
2e60: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
2e70: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
2e80: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2e90: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
2ea0: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2eb0: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
2ec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2ed0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2ee0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74  _BKPT;.  }.  iPt
2ef0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
2f00: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
2f10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f20: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
2f30: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
2f40: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2f50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f60: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f70: 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  }.  offset = PTR
2f80: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
2f90: 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d  t, key);.  pPtrm
2fa0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
2fb0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
2fc0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
2fd0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
2fe0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
2ff0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
3000: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
3010: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
3020: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
3030: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
3040: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
3050: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
3060: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
3070: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
3080: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3090: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
30a0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
30b0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
30d0: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
30e0: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
30f0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
3100: 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
3110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
3120: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
3130: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
3140: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3150: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
3160: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
3170: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
3180: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
3190: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
31a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
31b0: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
31c0: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
31d0: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
31e0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
31f0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
3200: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
3210: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
3220: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
3230: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
3240: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
3250: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
3260: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
3270: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
3280: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
3290: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
32a0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
32b0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
32c0: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
32d0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
32e0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
32f0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
3300: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
3310: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
3320: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
3330: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
3340: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3350: 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
3360: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
3370: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
3380: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
3390: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
33a0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
33b0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
33c0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
33d0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
33e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
33f0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
3400: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
3410: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
3420: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
3430: 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20  _PTROFFSET(pBt, 
3440: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
3450: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
3460: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
3470: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
3480: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
3490: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
34a0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
34b0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
34c0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
34d0: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
34e0: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
34f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
3500: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
3510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3520: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3530: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
3540: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
3550: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
3560: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
3570: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
3580: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
3590: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
35a0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
35b0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
35c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
35d0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
35e0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
35f0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
3600: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
3610: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
3620: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
3630: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
3640: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3650: 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50 61 67 65  ell) \.  ((pPage
3660: 29 2d 3e 61 44 61 74 61 20 2b 20 67 65 74 32 62  )->aData + get2b
3670: 79 74 65 28 26 28 70 50 61 67 65 29 2d 3e 61 44  yte(&(pPage)->aD
3680: 61 74 61 5b 28 70 50 61 67 65 29 2d 3e 63 65 6c  ata[(pPage)->cel
3690: 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43 65 6c 6c  lOffset+2*(iCell
36a0: 29 5d 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49  )])).#ifdef SQLI
36b0: 54 45 5f 54 45 53 54 0a 75 38 20 2a 73 71 6c 69  TE_TEST.u8 *sqli
36c0: 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c  te3BtreeFindCell
36d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
36e0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 61   int iCell){.  a
36f0: 73 73 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20  ssert( iCell>=0 
3700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  );.  assert( iCe
3710: 6c 6c 3c 67 65 74 32 62 79 74 65 28 26 70 50 61  ll<get2byte(&pPa
3720: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
3730: 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29  >hdrOffset+3]) )
3740: 3b 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  ;.  return findC
3750: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
3760: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
3770: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
3780: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
3790: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  f sqlite3BtreeFi
37a0: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
37b0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
37c0: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
37d0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
37e0: 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a    See insert.*/.
37f0: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
3800: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
3810: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
3820: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
3830: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3840: 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
3850: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
3860: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
3870: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
3880: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3890: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
38a0: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
38b0: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
38c0: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
38d0: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
38e0: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
38f0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
3900: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
3910: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3920: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
3930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
3940: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
3950: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
3960: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
3970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
3980: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
3990: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
39a0: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
39b0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
39c0: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
39d0: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
39e0: 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42  ction.  sqlite3B
39f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
3a00: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
3a10: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
3a20: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
3a30: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
3a40: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
3a50: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
3a60: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
3a70: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
3a80: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
3a90: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
3aa0: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
3ab0: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
3ac0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
3ad0: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  tead of.** sqlit
3ae0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3af0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
3b00: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
3b10: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
3b20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3b30: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
3b40: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
3b50: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
3b60: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
3b70: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
3b80: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
3b90: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3ba0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
3bb0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
3bc0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
3bd0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
3be0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
3bf0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
3c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3c10: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
3c20: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
3c30: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
3c40: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
3c50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
3c60: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
3c70: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
3c80: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
3c90: 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  xHeld(pPage->pBt
3ca0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
3cb0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
3cc0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
3cd0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
3ce0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
3cf0: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
3d00: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
3d10: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
3d20: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
3d30: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
3d40: 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67  ta ){.    n += g
3d50: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
3d60: 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29  l[n], &nPayload)
3d70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
3d80: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d  Payload = 0;.  }
3d90: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20  .  pInfo->nData 
3da0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66  = nPayload;.  if
3db0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
3dc0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  ){.    n += getV
3dd0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
3de0: 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e   (u64 *)&pInfo->
3df0: 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
3e00: 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e      u32 x;.    n
3e10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
3e20: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a  &pCell[n], &x);.
3e30: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
3e40: 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  = x;.    nPayloa
3e50: 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49  d += x;.  }.  pI
3e60: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
3e70: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
3e80: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
3e90: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
3ea0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
3eb0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
3ec0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
3ed0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
3ee0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
3ef0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
3f00: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
3f10: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
3f20: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
3f30: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
3f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3f50: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
3f60: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
3f70: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
3f80: 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64  Local = nPayload
3f90: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
3fa0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
3fb0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
3fc0: 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53   + n;.    if( nS
3fd0: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e  ize<4 ){.      n
3fe0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
3ff0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
4000: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
4010: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
4020: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
4030: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4040: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
4050: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
4060: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
4070: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4080: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4090: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
40a0: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
40b0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
40c0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
40d0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
40e0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
40f0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
4100: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
4110: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
4120: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
4130: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
4140: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
4150: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
4160: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
4170: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4180: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4190: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
41a0: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
41b0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
41c0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
41d0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
41e0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
41f0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
4200: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
4210: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
4220: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
4230: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4240: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4250: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
4260: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
4270: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4280: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4290: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
42a0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
42b0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
42c0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
42d0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
42e0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
42f0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
4300: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
4310: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
4320: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
4330: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
4340: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
4350: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
4360: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
4370: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4380: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4390: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
43a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
43b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
43c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
43d0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
43e0: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
43f0: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
4400: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
4410: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4420: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
4430: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
4440: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4450: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
4460: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
4470: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4480: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4490: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
44a0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
44b0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
44c0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
44d0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
44e0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
44f0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4510: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
4520: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
4530: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
4540: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
4550: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
4560: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
4570: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4580: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4590: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
45a0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
45b0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
45c0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
45d0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
45e0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
45f0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
4600: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
4610: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
4620: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
4630: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
4640: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
4650: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
4660: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
4670: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4680: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4690: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
46a0: 69 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  int cellSize(Mem
46b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
46c0: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
46d0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
46e0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
46f0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4700: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4710: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
4720: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
4730: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
4740: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
4750: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
4760: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4770: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4780: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4790: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
47a0: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
47b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
47c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
47d0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
47e0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
47f0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
4800: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4810: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4820: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4830: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4840: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4850: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4860: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4870: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4880: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4890: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
48a0: 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29  ){.  if( pCell )
48b0: 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
48c0: 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nfo;.    sqlite3
48d0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
48e0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
48f0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
4900: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
4910: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4920: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
4930: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
4940: 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
4950: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4960: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
4970: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
4980: 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
4990: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
49a0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
49b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
49c0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
49d0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
49e0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
49f0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
4a00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
4a10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
4a20: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69  * If the cell wi
4a30: 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f  th index iCell o
4a40: 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  n page pPage con
4a50: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
4a60: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
4a70: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
4a80: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
4a90: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
4aa0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
4ab0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4ac0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
4ad0: 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  fl(MemPage *pPag
4ae0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
4af0: 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73   u8 *pCell;.  as
4b00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4b10: 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67  eeMutexHeld(pPag
4b20: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
4b30: 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
4b40: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
4b50: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65  ge, iCell);.  re
4b60: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76  turn ptrmapPutOv
4b70: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
4b80: 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ll);.}.#endif...
4b90: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
4ba0: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
4bb0: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
4bc0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
4bd0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
4be0: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
4bf0: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
4c00: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
4c10: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
4c20: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
4c30: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
4c40: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
4c50: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
4c60: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
4c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
4c80: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
4c90: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
4ca0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
4cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
4cc0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
4cd0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
4ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4cf0: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
4d00: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ell */.  int add
4d10: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4d20: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
4d30: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
4d40: 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  r cell pointer a
4d50: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rray */.  int hd
4d60: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4d70: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
4d80: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
4d90: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
4dc0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
4dd0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
4de0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4df0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
4e00: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
4e10: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
4e20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
4e30: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
4e40: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
4e50: 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4e70: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
4e80: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
4e90: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4eb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
4ec0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
4ed0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4ee0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
4ef0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
4f00: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
4f10: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
4f20: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
4f30: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
4f40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4f50: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
4f60: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
4f70: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
4f80: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
4f90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4fa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
4fb0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
4fc0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
4fd0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
4fe0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
4ff0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
5000: 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50  treeMutexHeld(pP
5010: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5020: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
5030: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61  ite3_malloc( pPa
5040: 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
5050: 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70 3d  e );.  if( temp=
5060: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
5070: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74 61  TE_NOMEM;.  data
5080: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
5090: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
50a0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
50b0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
50c0: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
50d0: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
50e0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
50f0: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
5100: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
5110: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
5120: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
5130: 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20 67  eSize;.  brk = g
5140: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5150: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
5160: 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61 74  &temp[brk], &dat
5170: 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
5180: 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72 6b  ze - brk);.  brk
5190: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
51a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
51b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
51c0: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
51d0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
51e0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
51f0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
5200: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
5210: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
5220: 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Addr);.    asser
5230: 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74  t( pc<pPage->pBt
5240: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5250: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
5260: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
5270: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62 72  emp[pc]);.    br
5280: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d  k -= size;.    m
5290: 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b 5d  emcpy(&data[brk]
52a0: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
52b0: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
52c0: 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20 20  (pAddr, brk);.  
52d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b 3e  }.  assert( brk>
52e0: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
52f0: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
5300: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
5310: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
5320: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
5330: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
5340: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
5350: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
5360: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
5370: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
5380: 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b 0a  , 0, brk-addr);.
5390: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 74    sqlite3_free(t
53a0: 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  emp);.  return S
53b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
53c0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
53d0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
53e0: 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   on a page..**.*
53f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
5400: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
5410: 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69  Data[] of the fi
5420: 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74  rst byte of.** t
5430: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
5440: 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69  n. Or return 0 i
5450: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  f there is not e
5460: 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70  nough free.** sp
5470: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
5480: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61  to satisfy the a
5490: 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73  llocation reques
54a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
54b0: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42  page contains nB
54c0: 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61  ytes of free spa
54d0: 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ce but does not 
54e0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65  contain.** nByte
54f0: 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20  s of contiguous 
5500: 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e  free space, then
5510: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75   this routine au
5520: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63  tomatically.** c
5530: 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74  alls defragement
5540: 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c  Page() to consol
5550: 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73  idate all free s
5560: 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20  pace before .** 
5570: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e  allocating the n
5580: 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61  ew chunk..*/.sta
5590: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
55a0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
55b0: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29  Page, int nByte)
55c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63  {.  int addr, pc
55d0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a  , hdr;.  int siz
55e0: 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a  e;.  int nFrag;.
55f0: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74    int top;.  int
5600: 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65   nCell;.  int ce
5610: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69  llOffset;.  unsi
5620: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
5630: 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61  .  .  data = pPa
5640: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73  ge->aData;.  ass
5650: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5660: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
5670: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
5680: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5690: 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
56a0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
56b0: 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70  texHeld(pPage->p
56c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
56d0: 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42  if( nByte<4 ) nB
56e0: 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70  yte = 4;.  if( p
56f0: 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74  Page->nFree<nByt
5700: 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  e || pPage->nOve
5710: 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e  rflow>0 ) return
5720: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   0;.  pPage->nFr
5730: 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68  ee -= nByte;.  h
5740: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
5750: 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20  ffset;..  nFrag 
5760: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
5770: 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b   if( nFrag<60 ){
5780: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
5790: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
57a0: 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62  ing for a slot b
57b0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
57c0: 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  isfy the.    ** 
57d0: 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a  space request. *
57e0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72  /.    addr = hdr
57f0: 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +1;.    while( (
5800: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
5810: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
5820: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
5830: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
5840: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2]);.      if( s
5850: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
5860: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e        if( size<n
5870: 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20  Byte+4 ){.      
5880: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
5890: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
58a0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
58b0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e   data[hdr+7] = n
58c0: 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42  Frag + size - nB
58d0: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  yte;.          r
58e0: 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20  eturn pc;.      
58f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5900: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
5910: 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42  a[pc+2], size-nB
5920: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  yte);.          
5930: 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65  return pc + size
5940: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
5950: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5960: 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20    addr = pc;.   
5970: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
5980: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
5990: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
59a0: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
59b0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
59c0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
59d0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
59e0: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
59f0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5a00: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
5a10: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
5a20: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
5a30: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
5a40: 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  set;.  if( nFrag
5a50: 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73  >=60 || cellOffs
5a60: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74  et + 2*nCell > t
5a70: 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20  op - nByte ){.  
5a80: 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74    if( defragment
5a90: 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65  Page(pPage) ) re
5aa0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20  turn 0;.    top 
5ab0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5ac0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20  [hdr+5]);.  }.  
5ad0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
5ae0: 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73  assert( cellOffs
5af0: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20  et + 2*nCell <= 
5b00: 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74  top );.  put2byt
5b10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
5b20: 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74  top);.  return t
5b30: 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  op;.}../*.** Ret
5b40: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
5b50: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
5b60: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
5b70: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
5b80: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
5b90: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
5ba0: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
5bb0: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
5bc0: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
5bd0: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
5be0: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
5bf0: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
5c00: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
5c10: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
5c20: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
5c30: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
5c40: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
5c50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
5c60: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
5c70: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
5c80: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
5c90: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
5ca0: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
5cb0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
5cc0: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
5cd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
5ce0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5cf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
5d00: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
5d10: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
5d20: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
5d30: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
5d40: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
5d50: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
5d60: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
5d70: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
5d80: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
5d90: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
5da0: 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e  utexHeld(pPage->
5db0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5dc0: 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20 73 69   if( size<4 ) si
5dd0: 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64 65 66 20  ze = 4;..#ifdef 
5de0: 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
5df0: 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72  LETE.  /* Overwr
5e00: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
5e10: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
5e20: 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43 55  os when the SECU
5e30: 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20  RE_DELETE .  ** 
5e40: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
5e50: 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
5e60: 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64  e */.  memset(&d
5e70: 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73  ata[start], 0, s
5e80: 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
5e90: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
5ea0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
5eb0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
5ec0: 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64  eeblocks */.  hd
5ed0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
5ee0: 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68  fset;.  addr = h
5ef0: 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  dr + 1;.  while(
5f00: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
5f10: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5f20: 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69  )<start && pbegi
5f30: 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  n>0 ){.    asser
5f40: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
5f50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5f60: 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  e-4 );.    asser
5f70: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
5f80: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  ;.    addr = pbe
5f90: 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gin;.  }.  asser
5fa0: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
5fb0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5fc0: 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-4 );.  assert(
5fd0: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20   pbegin>addr || 
5fe0: 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  pbegin==0 );.  p
5ff0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  ut2byte(&data[ad
6000: 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70  dr], start);.  p
6010: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
6020: 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20  art], pbegin);. 
6030: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6040: 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b  start+2], size);
6050: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
6060: 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  += size;..  /* C
6070: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
6080: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
6090: 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e    addr = pPage->
60a0: 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20  hdrOffset + 1;. 
60b0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
60c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
60d0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
60e0: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
60f0: 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
6100: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
6110: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
6120: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
6130: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
6140: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
6150: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6160: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
6170: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6180: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
6190: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
61a0: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
61b0: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
61c0: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
61d0: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
61e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
61f0: 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70  rt( frag<=data[p
6200: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
6210: 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61  7] );.      data
6220: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
6230: 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20  t+7] -= frag;.  
6240: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
6250: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32  ta[pbegin], get2
6260: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
6270: 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  ]));.      put2b
6280: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6290: 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62  +2], pnext+get2b
62a0: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
62b0: 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20  2])-pbegin);.   
62c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
62d0: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20  dr = pbegin;.   
62e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
62f0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6300: 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74   area begins wit
6310: 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72  h a freeblock, r
6320: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69  emove it. */.  i
6330: 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d  f( data[hdr+1]==
6340: 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64  data[hdr+5] && d
6350: 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61  ata[hdr+2]==data
6360: 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69  [hdr+6] ){.    i
6370: 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67  nt top;.    pbeg
6380: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
6390: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
63a0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64   memcpy(&data[hd
63b0: 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67  r+1], &data[pbeg
63c0: 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  in], 2);.    top
63d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
63e0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
63f0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
6400: 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32  r+5], top + get2
6410: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
6420: 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n+2]));.  }.}../
6430: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
6440: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
6450: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
6460: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
6470: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
6480: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
6490: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
64a0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
64b0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
64c0: 69 64 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  id decodeFlags(M
64d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
64e0: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
64f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
6500: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
6510: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
6520: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6530: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
6540: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
6550: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
6560: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
6570: 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e  utexHeld(pPage->
6580: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6590: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
65a0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50 54   (flagByte & (PT
65b0: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
65c0: 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50  FDATA))!=0;.  pP
65d0: 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20  age->zeroData = 
65e0: 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f  (flagByte & PTF_
65f0: 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20  ZERODATA)!=0;.  
6600: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 66  pPage->leaf = (f
6610: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
6620: 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  AF)!=0;.  pPage-
6630: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
6640: 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  4*(pPage->leaf==
6650: 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  0);.  pBt = pPag
6660: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
6670: 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41  agByte & PTF_LEA
6680: 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  FDATA ){.    pPa
6690: 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 31  ge->leafData = 1
66a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
66b0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
66c0: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
66d0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
66e0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
66f0: 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c 65  e{.    pPage->le
6700: 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  afData = 0;.    
6710: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
6720: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
6730: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
6740: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
6750: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ocal;.  }.  pPag
6760: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70  e->hasData = !(p
6770: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c  Page->zeroData |
6780: 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  | (!pPage->leaf 
6790: 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  && pPage->leafDa
67a0: 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ta));.}../*.** I
67b0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
67c0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
67d0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
67e0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lock..**.** The 
67f0: 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
6800: 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  r must be a poin
6810: 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
6820: 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 74  ge which.** is t
6830: 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65  he parent of the
6840: 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69 74   page being init
6850: 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 6f  ialized.  The ro
6860: 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65  ot of a.** BTree
6870: 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20 61   has no parent a
6880: 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20 70  nd so for that p
6890: 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55  age, pParent==NU
68a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LL..**.** Return
68b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
68c0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
68d0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
68e0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
68f0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
6900: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
6910: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
6920: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
6930: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
6940: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
6950: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
6960: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
6970: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
6980: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
6990: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
69a0: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
69b0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
69c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
69d0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20 20  treeInitPage(.  
69e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
69f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
6a00: 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  ge to be initial
6a10: 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ized */.  MemPag
6a20: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20  e *pParent      
6a30: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20   /* The parent. 
6a40: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20  /.){.  int pc;  
6a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6a70: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
6a80: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
6a90: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  ->aData[] */.  i
6aa0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
6ab0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
6ac0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
6ad0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20   header */.  u8 
6ae0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
6af0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
6b00: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74  e->aData */.  Bt
6b10: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
6b20: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
6b30: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
6b40: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
6b50: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
6b60: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
6b70: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
6b80: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
6b90: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
6ba0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
6bb0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
6bc0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
6bd0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
6be0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
6bf0: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
6c00: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  he page */.  int
6c10: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
6c20: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
6c30: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6c40: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74  t area */..  pBt
6c50: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
6c60: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
6c70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6c80: 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65  rent==0 || pPare
6c90: 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  nt->pBt==pBt );.
6ca0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6cb0: 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
6cc0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6cd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6ce0: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
6cf0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
6d00: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
6d10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6d20: 3e 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73  >aData == &((uns
6d30: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67  igned char*)pPag
6d40: 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e)[-pBt->pageSiz
6d50: 65 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  e] );.  if( pPag
6d60: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72  e->pParent!=pPar
6d70: 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70  ent && (pPage->p
6d80: 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61  Parent!=0 || pPa
6d90: 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20  ge->isInit) ){. 
6da0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
6db0: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76   page should nev
6dc0: 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73  er change unless
6dd0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72   the file is cor
6de0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  rupt */.    retu
6df0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6e00: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
6e10: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
6e20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6e30: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  OK;.  if( pPage-
6e40: 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70  >pParent==0 && p
6e50: 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20  Parent!=0 ){.   
6e60: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
6e70: 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  = pParent;.    s
6e80: 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
6e90: 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
6ea0: 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50  ;.  }.  hdr = pP
6eb0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
6ec0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
6ed0: 61 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46  aData;.  decodeF
6ee0: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
6ef0: 5b 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d  [hdr]);.  pPage-
6f00: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
6f10: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
6f20: 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  t = 0;.  usableS
6f30: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
6f40: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
6f50: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
6f60: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
6f70: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
6f80: 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32  af;.  top = get2
6f90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
6fa0: 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  ]);.  pPage->nCe
6fb0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
6fc0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69  ata[hdr+3]);.  i
6fd0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
6fe0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
6ff0: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
7000: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
7010: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
7020: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
7030: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
7040: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7050: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
7060: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Page->nCell==0 &
7070: 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20  & pParent!=0 && 
7080: 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
7090: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70   ){.    /* All p
70a0: 61 67 65 73 20 6d 75 73 74 20 68 61 76 65 20 61  ages must have a
70b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
70c0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f  , except for roo
70d0: 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  t pages */.    r
70e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
70f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
7100: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
7110: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
7120: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
7130: 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
7140: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
7150: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
7160: 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63  dr+7] + top - (c
7170: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
7180: 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77  age->nCell);.  w
7190: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
71a0: 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65    int next, size
71b0: 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61  ;.    if( pc>usa
71c0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
71d0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
71e0: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
71f0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7200: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7210: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
7220: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
7230: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
7240: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
7250: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
7260: 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26     if( next>0 &&
7270: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
7280: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
7290: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
72a0: 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
72b0: 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  der */.      ret
72c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
72d0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
72e0: 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a      nFree += siz
72f0: 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74  e;.    pc = next
7300: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
7310: 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20  Free = nFree;.  
7320: 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c  if( nFree>=usabl
7330: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  eSize ){.    /* 
7340: 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f  Free space canno
7350: 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70  t exceed total p
7360: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
7370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7380: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
7390: 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ..  pPage->isIni
73a0: 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
73b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
73c0: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
73d0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
73e0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
73f0: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
7400: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
7410: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7420: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
7430: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
7440: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
7450: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
7460: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
7470: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
7480: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
7490: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
74a0: 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66  rOffset;.  int f
74b0: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
74c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
74d0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
74e0: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
74f0: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
7500: 28 20 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67  ( &data[pBt->pag
7510: 65 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67  eSize] == (unsig
7520: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20  ned char*)pPage 
7530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7540: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
7550: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
7560: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
7570: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
7580: 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74  texHeld(pBt->mut
7590: 65 78 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ex) );.  memset(
75a0: 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
75b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
75c0: 20 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64   hdr);.  data[hd
75d0: 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69  r] = flags;.  fi
75e0: 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  rst = hdr + 8 + 
75f0: 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  4*((flags&PTF_LE
7600: 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65  AF)==0);.  memse
7610: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
7620: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
7630: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
7640: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
7650: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
7660: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
7670: 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ree = pBt->usabl
7680: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20  eSize - first;. 
7690: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
76a0: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
76b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
76c0: 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63   hdr;.  pPage->c
76d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
76e0: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  t;.  pPage->nOve
76f0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61  rflow = 0;.  pPa
7700: 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
7710: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
7720: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
7730: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  sInit = 1;.}../*
7740: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
7750: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
7760: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
7770: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
7780: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
7790: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
77a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
77b0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
77c0: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
77d0: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
77e0: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
77f0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
7800: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
7810: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
7820: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
7830: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
7840: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
7850: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
7860: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
7870: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
7880: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
7890: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
78a0: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
78b0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
78c0: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
78d0: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
78e0: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
78f0: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
7900: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
7910: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
7920: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7930: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
7940: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
7950: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
7960: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
7970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7980: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
7990: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
79a0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
79b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
79c0: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
79d0: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
79e0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
79f0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
7a00: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
7a10: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
7a20: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
7a30: 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61 67 65  *pPage;.  DbPage
7a40: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
7a50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
7a60: 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d  eeMutexHeld(pBt-
7a70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
7a80: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
7a90: 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
7aa0: 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
7ab0: 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43  **)&pDbPage, noC
7ac0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  ontent);.  if( r
7ad0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
7ae0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
7af0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
7b00: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
7b10: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
7b20: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
7b30: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
7b40: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
7b50: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
7b60: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
7b70: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
7b80: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
7b90: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
7ba0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
7bb0: 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65  0 : 0;.  *ppPage
7bc0: 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75   = pPage;.  retu
7bd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7be0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
7bf0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
7c00: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
7c10: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
7c20: 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63  e.** is just a c
7c30: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
7c40: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
7c50: 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  te calls to.** s
7c60: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
7c70: 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ge() and sqlite3
7c80: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  BtreeInitPage().
7c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
7ca0: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
7cb0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
7cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7ce0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
7cf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7d00: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
7d10: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
7d20: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
7d30: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
7d40: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
7d50: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
7d60: 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  ent     /* Paren
7d70: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
7d80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
7d90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
7da0: 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42  treeMutexHeld(pB
7db0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
7dc0: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
7dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7de0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
7df0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
7e00: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
7e10: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
7e20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
7e30: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
7e40: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
7e50: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7e60: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
7e70: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
7e80: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
7e90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
7ea0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
7eb0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
7ec0: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
7ed0: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
7ee0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
7ef0: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
7f00: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7f10: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
7f20: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
7f30: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
7f40: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
7f50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7f60: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
7f70: 20 20 61 73 73 65 72 74 28 20 26 70 50 61 67 65    assert( &pPage
7f80: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70  ->aData[pPage->p
7f90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d 28  Bt->pageSize]==(
7fa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
7fb0: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
7fc0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
7fd0: 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d  MutexHeld(pPage-
7fe0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
7ff0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
8000: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
8010: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
8020: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8030: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
8040: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
8050: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  unt for a page.*
8060: 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  * reaches zero. 
8070: 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65   We need to unre
8080: 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f  f the pParent po
8090: 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a  inter when that.
80a0: 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73  ** happens..*/.s
80b0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44  tatic void pageD
80c0: 65 73 74 72 75 63 74 6f 72 28 44 62 50 61 67 65  estructor(DbPage
80d0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67   *pData, int pag
80e0: 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67  eSize){.  MemPag
80f0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
8100: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
8110: 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  7)==0 );.  pPage
8120: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
8130: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8140: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
8150: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
8160: 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
8170: 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
8180: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 61 73  >pParent;.    as
8190: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
81a0: 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67  eeMutexHeld(pPag
81b0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
81c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61  ;.    pPage->pPa
81d0: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  rent = 0;.    re
81e0: 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
81f0: 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  t);.  }.  pPage-
8200: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a  >isInit = 0;.}..
8210: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
8220: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
8230: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
8240: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
8250: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
8260: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
8270: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
8280: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
8290: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
82a0: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
82b0: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
82c0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
82d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
82e0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
82f0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
8300: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
8310: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
8320: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
8330: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
8340: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
8350: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
8360: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
8370: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
8380: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
8390: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
83a0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
83b0: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
83c0: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
83d0: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
83e0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
83f0: 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  a);.  if( pPage-
8400: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
8410: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
8420: 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50 61  reeMutexHeld(pPa
8430: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8440: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
8450: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  Init = 0;.    sq
8460: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
8470: 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
8480: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d  >pParent);.  }.}
8490: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
84a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
84b0: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
84c0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
84d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
84e0: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
84f0: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
8500: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
8510: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
8520: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
8530: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
8540: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
8550: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
8560: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
8570: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
8580: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
8590: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
85a0: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
85b0: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
85c0: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
85d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
85e0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
85f0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
8600: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
8610: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
8620: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
8630: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
8640: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
8650: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
8660: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70   */.  sqlite3 *p
8670: 53 71 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a  Sqlite,       /*
8680: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
8690: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
86a0: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
86b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
86c0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
86d0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
86e0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
86f0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
8700: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
8710: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
8720: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20   *pVfs;      /* 
8730: 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66  The VFS to use f
8740: 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  or this btree */
8750: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
8760: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 68   = 0;      /* Sh
8770: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
8780: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
8790: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
87b0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
87c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
87d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65  TE_OK;.  int nRe
87e0: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
87f0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
8800: 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 70 53  [100];..  if( pS
8810: 71 6c 69 74 65 20 29 7b 0a 20 20 20 20 70 56 66  qlite ){.    pVf
8820: 73 20 3d 20 70 53 71 6c 69 74 65 2d 3e 70 56 66  s = pSqlite->pVf
8830: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
8840: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
8850: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 7d 0a  fs_find(0);.  }.
8860: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8870: 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
8880: 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
8890: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
88a0: 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
88b0: 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
88c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
88d0: 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
88e0: 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
88f0: 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54  ased database. T
8900: 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e  his symbol is on
8910: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20  ly required if. 
8920: 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68   ** either of th
8930: 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72  e shared-data or
8940: 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74   autovacuum feat
8950: 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65  ures are compile
8960: 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  d .  ** into the
8970: 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23   library..  */.#
8980: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8990: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
89a0: 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65  ACHE) || !define
89b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
89c0: 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64  TOVACUUM).  #ifd
89d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
89e0: 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73  EMORYDB.    cons
89f0: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
8a00: 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63  0;.  #else.    c
8a10: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
8a20: 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20   = zFilename && 
8a30: 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d  !strcmp(zFilenam
8a40: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a  e, ":memory:");.
8a50: 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a    #endif.#endif.
8a60: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
8a70: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
8a80: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
8a90: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
8aa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8ab0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
8ac0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
8ad0: 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53 71 6c  ->pSqlite = pSql
8ae0: 69 74 65 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  ite;..#if !defin
8af0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8b00: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
8b10: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8b20: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
8b30: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
8b40: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
8b50: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
8b60: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
8b70: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
8b80: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
8b90: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
8ba0: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
8bb0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 42 54   if( (flags & BT
8bc0: 52 45 45 5f 50 52 49 56 41 54 45 29 3d 3d 30 0a  REE_PRIVATE)==0.
8bd0: 20 20 20 26 26 20 69 73 4d 65 6d 64 62 3d 3d 30     && isMemdb==0
8be0: 0a 20 20 20 26 26 20 28 70 53 71 6c 69 74 65 3d  .   && (pSqlite=
8bf0: 3d 30 20 7c 7c 20 28 70 53 71 6c 69 74 65 2d 3e  =0 || (pSqlite->
8c00: 66 6c 61 67 73 20 26 53 51 4c 49 54 45 5f 56 74  flags &SQLITE_Vt
8c10: 61 62 29 3d 3d 30 29 0a 20 20 20 26 26 20 7a 46  ab)==0).   && zF
8c20: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
8c30: 6e 61 6d 65 5b 30 5d 0a 20 20 20 26 26 20 73 71  name[0].   && sq
8c40: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
8c50: 45 6e 61 62 6c 65 64 0a 20 20 29 7b 0a 20 20 20  Enabled.  ){.   
8c60: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
8c70: 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 73  name = (char *)s
8c80: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56  qlite3_malloc(pV
8c90: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b  fs->mxPathname);
8ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
8cb0: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
8cc0: 0a 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65  .    p->sharable
8cd0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
8ce0: 71 6c 69 74 65 20 29 7b 0a 20 20 20 20 20 20 70  qlite ){.      p
8cf0: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 20 7c 3d  Sqlite->flags |=
8d00: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
8d10: 63 68 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  che;.    }.    i
8d20: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
8d30: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
8d40: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
8d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8d60: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
8d70: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
8d80: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
8d90: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
8da0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 75 74 65  hname);.    mute
8db0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
8dc0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
8dd0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
8de0: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 73  C_MASTER);.    s
8df0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8e00: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
8e10: 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 73 71 6c  .    for(pBt=sql
8e20: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
8e30: 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  ist; pBt; pBt=pB
8e40: 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
8e50: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
8e60: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66  ef>0 );.      if
8e70: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
8e80: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
8e90: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
8ea0: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 20 29 7b  pBt->pPager)) ){
8eb0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20  .        p->pBt 
8ec0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70  = pBt;.        p
8ed0: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
8ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8ef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8f00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8f10: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
8f20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8f30: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
8f40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
8f50: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
8f60: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
8f70: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
8f80: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
8f90: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
8fa0: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
8fb0: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
8fc0: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
8fd0: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
8fe0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
8ff0: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
9000: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
9010: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
9020: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
9030: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
9040: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
9050: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
9060: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9070: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
9080: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
9090: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
90a0: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
90b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
90c0: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
90d0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
90e0: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
90f0: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
9100: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
9110: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
9120: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
9130: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9140: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
9150: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
9160: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
9170: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
9180: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
9190: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
91a0: 65 2c 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66  e, EXTRA_SIZE, f
91b0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
91c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
91d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
91e0: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
91f0: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
9200: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
9210: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
9220: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9230: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9240: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
9250: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
9260: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
9270: 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  ;.  .    sqlite3
9280: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
9290: 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  or(pBt->pPager, 
92a0: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b  pageDestructor);
92b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
92c0: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
92d0: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
92e0: 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e  init);.    pBt->
92f0: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
9300: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
9310: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
9320: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
9330: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
9340: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
9350: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67  Bt->pageSize = g
9360: 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64  et2byte(&zDbHead
9370: 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  er[16]);.    if(
9380: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
9390: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
93a0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
93b0: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
93c0: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
93d0: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
93e0: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
93f0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
9400: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
9410: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
9420: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
9430: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
9440: 32 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42 74  25% */.      pBt
9450: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
9460: 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20   32;   /* 12.5% 
9470: 2a 2f 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  */.      pBt->mi
9480: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
9490: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
94a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
94b0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
94c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
94d0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
94e0: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
94f0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9500: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
9510: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
9520: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
9530: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
9540: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
9550: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
9560: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
9570: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
9580: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
9590: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
95a0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
95b0: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
95c0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
95d0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
95e0: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
95f0: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
9600: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
9610: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
9620: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
9630: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9640: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
9650: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
9660: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
9670: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
9680: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
9690: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
96a0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
96b0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
96c0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
96d0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
96e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
96f0: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
9700: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
9710: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
9720: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
9730: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
9740: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d   = zDbHeader[21]
9750: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e  ;.      pBt->min
9760: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
9770: 65 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 20  eader[22];.     
9780: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
9790: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 33  c = zDbHeader[23
97a0: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
97b0: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
97c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
97d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
97e0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
97f0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
9800: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
9810: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
9820: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
9830: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
9840: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
9850: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
9860: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  if.    }.    pBt
9870: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
9880: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
9890: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
98a0: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
98b0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
98c0: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
98d0: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
98e0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
98f0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
9900: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
9910: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a  >pageSize);.   .
9920: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9930: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
9940: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
9950: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
9960: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
9970: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
9980: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
9990: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
99a0: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
99b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
99c0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
99d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
99e0: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
99f0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
9a00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65   = 1;.      mute
9a10: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
9a20: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
9a30: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
9a40: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
9a50: 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
9a60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
9a70: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
9a80: 41 53 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  AST);.      sqli
9a90: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9aa0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
9ab0: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
9ac0: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
9ad0: 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  cheList;.      s
9ae0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
9af0: 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20 20 20  eList = pBt;.   
9b00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9b10: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
9b20: 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
9b30: 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
9b40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9b50: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
9b60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9b70: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
9b80: 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
9b90: 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
9ba0: 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
9bb0: 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
9bc0: 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
9bd0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
9be0: 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
9bf0: 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
9c00: 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
9c10: 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
9c20: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
9c30: 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
9c40: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
9c50: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
9c60: 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
9c70: 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
9c80: 28 69 3d 30 3b 20 69 3c 70 53 71 6c 69 74 65 2d  (i=0; i<pSqlite-
9c90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
9ca0: 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 70 53    if( (pSib = pS
9cb0: 71 6c 69 74 65 2d 3e 61 44 62 5b 69 5d 2e 70 42  qlite->aDb[i].pB
9cc0: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
9cd0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
9ce0: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
9cf0: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
9d00: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
9d10: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
9d20: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
9d30: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
9d40: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
9d50: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
9d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
9d70: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
9d80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d90: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
9da0: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
9db0: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
9dc0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
9dd0: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
9de0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
9df0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
9e00: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
9e10: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
9e20: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
9e30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
9e40: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
9e50: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
9e60: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
9e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9e80: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
9e90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9ea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9eb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
9ec0: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
9ed0: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
9ee0: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
9ef0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9f00: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
9f10: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
9f20: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
9f30: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
9f40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9f50: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
9f60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9f70: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
9f80: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9f90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
9fa0: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
9fb0: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
9fc0: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
9fd0: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
9fe0: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
9ff0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
a000: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
a010: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
a020: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
a030: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
a040: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
a050: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
a060: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
a070: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
a080: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
a090: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
a0a0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
a0b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a0c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
a0d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a0e0: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
a0f0: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
a100: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
a110: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a120: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
a130: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a140: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
a150: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
a160: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
a170: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c  C_MASTER);.  sql
a180: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a190: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
a1a0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
a1b0: 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
a1c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
a1d0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3d 3d  haredCacheList==
a1e0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
a1f0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
a200: 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ist = pBt->pNext
a210: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a220: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
a230: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a240: 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  t;.      while( 
a250: 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
a260: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
a270: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
a280: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
a290: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  }.      if( pLis
a2a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
a2b0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
a2c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
a2d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a2e0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
a2f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
a300: 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
a310: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a320: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
a330: 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
a340: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
a350: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
a360: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
a370: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
a380: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
a390: 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
a3a0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
a3b0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
a3c0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
a3d0: 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
a3e0: 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  pCur;..  /* Clos
a3f0: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
a400: 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
a410: 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 73 71 6c 69  ndle.  */.  sqli
a420: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
a430: 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
a440: 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
a450: 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
a460: 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
a470: 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
a480: 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
a490: 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
a4a0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
a4b0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
a4c0: 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
a4d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
a4e0: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
a4f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
a500: 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
a510: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
a520: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
a530: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
a540: 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
a550: 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
a560: 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
a570: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
a580: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
a590: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
a5a0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
a5b0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
a5c0: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
a5d0: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
a5e0: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
a5f0: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
a600: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
a610: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
a620: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
a630: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
a640: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
a650: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
a660: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
a670: 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
a680: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
a690: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
a6a0: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
a6b0: 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
a6c0: 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
a6d0: 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
a6e0: 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
a6f0: 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
a700: 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
a710: 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
a720: 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
a730: 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
a740: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
a750: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
a760: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
a770: 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
a780: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
a790: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
a7a0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
a7b0: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
a7c0: 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
a7d0: 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
a7e0: 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
a7f0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
a800: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a810: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
a820: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a830: 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
a840: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a850: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
a860: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
a870: 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
a880: 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
a890: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
a8a0: 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
a8b0: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
a8c0: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
a8d0: 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
a8e0: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
a8f0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
a900: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
a910: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a920: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ..#if SQLITE_THR
a930: 45 41 44 53 41 46 45 20 26 26 20 21 64 65 66 69  EADSAFE && !defi
a940: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a950: 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a  SHARED_CACHE)./*
a960: 0a 2a 2a 20 45 6e 74 65 72 20 61 20 6d 75 74 65  .** Enter a mute
a970: 78 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 42  x on the given B
a980: 54 72 65 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Tree object..**.
a990: 2a 2a 20 49 66 20 74 68 65 20 6f 62 6a 65 63 74  ** If the object
a9a0: 20 69 73 20 6e 6f 74 20 73 68 61 72 61 62 6c 65   is not sharable
a9b0: 2c 20 74 68 65 6e 20 6e 6f 20 6d 75 74 65 78 20  , then no mutex 
a9c0: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
a9d0: 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 75  .** and this rou
a9e0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
a9f0: 20 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67    The underlying
aa00: 20 6d 75 74 65 78 20 69 73 20 6e 6f 6e 2d 72 65   mutex is non-re
aa10: 63 75 72 73 69 76 65 2e 0a 2a 2a 20 42 75 74 20  cursive..** But 
aa20: 77 65 20 6b 65 65 70 20 61 20 72 65 66 65 72 65  we keep a refere
aa30: 6e 63 65 20 63 6f 75 6e 74 20 69 6e 20 42 74 72  nce count in Btr
aa40: 65 65 2e 77 61 6e 74 54 6f 4c 6f 63 6b 20 73 6f  ee.wantToLock so
aa50: 20 74 68 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a   the behavior.**
aa60: 20 6f 66 20 74 68 69 73 20 69 6e 74 65 72 66 61   of this interfa
aa70: 63 65 20 69 73 20 72 65 63 75 72 73 69 76 65 2e  ce is recursive.
aa80: 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
aa90: 64 65 61 64 6c 6f 63 6b 73 2c 20 6d 75 6c 74 69  deadlocks, multi
aaa0: 70 6c 65 20 42 74 72 65 65 73 20 61 72 65 20 6c  ple Btrees are l
aab0: 6f 63 6b 65 64 20 69 6e 20 74 68 65 20 73 61 6d  ocked in the sam
aac0: 65 20 6f 72 64 65 72 0a 2a 2a 20 62 79 20 61 6c  e order.** by al
aad0: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
aae0: 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 70 2d 3e  ctions.  The p->
aaf0: 70 4e 65 78 74 20 69 73 20 61 20 6c 69 73 74 20  pNext is a list 
ab00: 6f 66 20 6f 74 68 65 72 0a 2a 2a 20 42 74 72 65  of other.** Btre
ab10: 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  es belonging to 
ab20: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
ab30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  e connection as 
ab40: 74 68 65 20 70 20 42 74 72 65 65 0a 2a 2a 20 77  the p Btree.** w
ab50: 68 69 63 68 20 6e 65 65 64 20 74 6f 20 62 65 20  hich need to be 
ab60: 6c 6f 63 6b 65 64 20 61 66 74 65 72 20 70 2e 20  locked after p. 
ab70: 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 67 65   If we cannot ge
ab80: 74 20 61 20 6c 6f 63 6b 20 6f 6e 0a 2a 2a 20 70  t a lock on.** p
ab90: 2c 20 74 68 65 6e 20 66 69 72 73 74 20 75 6e 6c  , then first unl
aba0: 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ock all of the o
abb0: 74 68 65 72 73 20 6f 6e 20 70 2d 3e 70 4e 65 78  thers on p->pNex
abc0: 74 2c 20 74 68 65 6e 20 77 61 69 74 0a 2a 2a 20  t, then wait.** 
abd0: 66 6f 72 20 74 68 65 20 6c 6f 63 6b 20 74 6f 20  for the lock to 
abe0: 62 65 63 6f 6d 65 20 61 76 61 69 6c 61 62 6c 65  become available
abf0: 20 6f 6e 20 70 2c 20 74 68 65 6e 20 72 65 6c 6f   on p, then relo
ac00: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  ck all of the.**
ac10: 20 73 75 62 73 65 71 75 65 6e 74 20 42 74 72 65   subsequent Btre
ac20: 65 73 20 74 68 61 74 20 64 65 73 69 72 65 20 61  es that desire a
ac30: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
ac40: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
ac50: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
ac60: 72 65 65 20 2a 70 4c 61 74 65 72 3b 0a 0a 20 20  ree *pLater;..  
ac70: 2f 2a 20 53 6f 6d 65 20 62 61 73 69 63 20 73 61  /* Some basic sa
ac80: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
ac90: 20 74 68 65 20 42 74 72 65 65 2e 20 20 54 68 65   the Btree.  The
aca0: 20 6c 69 73 74 20 6f 66 20 42 74 72 65 65 73 0a   list of Btrees.
acb0: 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62    ** connected b
acc0: 79 20 70 4e 65 78 74 20 61 6e 64 20 70 50 72 65  y pNext and pPre
acd0: 76 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 20 73  v should be in s
ace0: 6f 72 74 65 64 20 6f 72 64 65 72 20 62 79 0a 20  orted order by. 
acf0: 20 2a 2a 20 42 74 72 65 65 2e 70 42 74 20 76 61   ** Btree.pBt va
ad00: 6c 75 65 2e 20 41 6c 6c 20 65 6c 65 6d 65 6e 74  lue. All element
ad10: 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 73 68  s of the list sh
ad20: 6f 75 6c 64 20 62 65 6c 6f 6e 67 20 74 6f 0a 20  ould belong to. 
ad30: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 63 6f 6e   ** the same con
ad40: 6e 65 63 74 69 6f 6e 2e 20 4f 6e 6c 79 20 73 68  nection. Only sh
ad50: 61 72 65 64 20 42 74 72 65 65 73 20 61 72 65 20  ared Btrees are 
ad60: 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a  on the list. */.
ad70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
ad80: 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4e 65 78  xt==0 || p->pNex
ad90: 74 2d 3e 70 42 74 3e 70 2d 3e 70 42 74 20 29 3b  t->pBt>p->pBt );
ada0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
adb0: 72 65 76 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  rev==0 || p->pPr
adc0: 65 76 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  ev->pBt<p->pBt )
add0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
ade0: 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4e  Next==0 || p->pN
adf0: 65 78 74 2d 3e 70 53 71 6c 69 74 65 3d 3d 70 2d  ext->pSqlite==p-
ae00: 3e 70 53 71 6c 69 74 65 20 29 3b 0a 20 20 61 73  >pSqlite );.  as
ae10: 73 65 72 74 28 20 70 2d 3e 70 50 72 65 76 3d 3d  sert( p->pPrev==
ae20: 30 20 7c 7c 20 70 2d 3e 70 50 72 65 76 2d 3e 70  0 || p->pPrev->p
ae30: 53 71 6c 69 74 65 3d 3d 70 2d 3e 70 53 71 6c 69  Sqlite==p->pSqli
ae40: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
ae50: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 28  p->sharable || (
ae60: 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 70  p->pNext==0 && p
ae70: 2d 3e 70 50 72 65 76 3d 3d 30 29 20 29 3b 0a 0a  ->pPrev==0) );..
ae80: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6c    /* Check for l
ae90: 6f 63 6b 69 6e 67 20 63 6f 6e 73 69 73 74 65 6e  ocking consisten
aea0: 63 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  cy */.  assert( 
aeb0: 21 70 2d 3e 6c 6f 63 6b 65 64 20 7c 7c 20 70 2d  !p->locked || p-
aec0: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3e 30 20 29 3b  >wantToLock>0 );
aed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
aee0: 61 72 61 62 6c 65 20 7c 7c 20 70 2d 3e 77 61 6e  arable || p->wan
aef0: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  tToLock==0 );.. 
af00: 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 61 6c   /* We should al
af10: 72 65 61 64 79 20 68 6f 6c 64 20 61 20 6c 6f 63  ready hold a loc
af20: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
af30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
af40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
af50: 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
af60: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65  p->pSqlite->mute
af70: 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 2d  x) );..  if( !p-
af80: 3e 73 68 61 72 61 62 6c 65 20 29 20 72 65 74 75  >sharable ) retu
af90: 72 6e 3b 0a 20 20 70 2d 3e 77 61 6e 74 54 6f 4c  rn;.  p->wantToL
afa0: 6f 63 6b 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  ock++;.  if( p->
afb0: 6c 6f 63 6b 65 64 20 29 20 72 65 74 75 72 6e 3b  locked ) return;
afc0: 0a 0a 20 20 2f 2a 20 49 6e 20 6d 6f 73 74 20 63  ..  /* In most c
afd0: 61 73 65 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ases, we should 
afe0: 62 65 20 61 62 6c 65 20 74 6f 20 61 63 71 75 69  be able to acqui
aff0: 72 65 20 74 68 65 20 6c 6f 63 6b 20 77 65 0a 20  re the lock we. 
b000: 20 2a 2a 20 77 61 6e 74 20 77 69 74 68 6f 75 74   ** want without
b010: 20 68 61 76 69 6e 67 20 74 6f 20 67 6f 20 74 68   having to go th
b020: 72 6f 75 67 68 74 20 74 68 65 20 61 73 63 65 6e  rought the ascen
b030: 64 69 6e 67 20 6c 6f 63 6b 0a 20 20 2a 2a 20 70  ding lock.  ** p
b040: 72 6f 63 65 64 75 72 65 20 74 68 61 74 20 66 6f  rocedure that fo
b050: 6c 6c 6f 77 73 2e 20 20 4a 75 73 74 20 62 65 20  llows.  Just be 
b060: 73 75 72 65 20 6e 6f 74 20 74 6f 20 62 6c 6f 63  sure not to bloc
b070: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
b080: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28  lite3_mutex_try(
b090: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3d 3d  p->pBt->mutex)==
b0a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b0b0: 20 70 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a   p->locked = 1;.
b0c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b0d0: 0a 20 20 2f 2a 20 54 6f 20 61 76 6f 69 64 20 64  .  /* To avoid d
b0e0: 65 61 64 6c 6f 63 6b 2c 20 66 69 72 73 74 20 72  eadlock, first r
b0f0: 65 6c 65 61 73 65 20 61 6c 6c 20 6c 6f 63 6b 73  elease all locks
b100: 20 77 69 74 68 20 61 20 6c 61 72 67 65 72 0a 20   with a larger. 
b110: 20 2a 2a 20 42 74 53 68 61 72 65 64 20 61 64 64   ** BtShared add
b120: 72 65 73 73 2e 20 20 54 68 65 6e 20 61 63 71 75  ress.  Then acqu
b130: 69 72 65 20 6f 75 72 20 6c 6f 63 6b 2e 20 20 54  ire our lock.  T
b140: 68 65 6e 20 72 65 61 63 71 75 69 72 65 0a 20 20  hen reacquire.  
b150: 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 42 74 53  ** the other BtS
b160: 68 61 72 65 64 20 6c 6f 63 6b 73 20 74 68 61 74  hared locks that
b170: 20 77 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   we used to hold
b180: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 0a 20 20   in ascending.  
b190: 2a 2a 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20  ** order..  */. 
b1a0: 20 66 6f 72 28 70 4c 61 74 65 72 3d 70 2d 3e 70   for(pLater=p->p
b1b0: 4e 65 78 74 3b 20 70 4c 61 74 65 72 3b 20 70 4c  Next; pLater; pL
b1c0: 61 74 65 72 3d 70 4c 61 74 65 72 2d 3e 70 4e 65  ater=pLater->pNe
b1d0: 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  xt){.    assert(
b1e0: 20 70 4c 61 74 65 72 2d 3e 73 68 61 72 61 62 6c   pLater->sharabl
b1f0: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
b200: 20 70 4c 61 74 65 72 2d 3e 70 4e 65 78 74 3d 3d   pLater->pNext==
b210: 30 20 7c 7c 20 70 4c 61 74 65 72 2d 3e 70 4e 65  0 || pLater->pNe
b220: 78 74 2d 3e 70 42 74 3e 70 4c 61 74 65 72 2d 3e  xt->pBt>pLater->
b230: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
b240: 74 28 20 21 70 4c 61 74 65 72 2d 3e 6c 6f 63 6b  t( !pLater->lock
b250: 65 64 20 7c 7c 20 70 4c 61 74 65 72 2d 3e 77 61  ed || pLater->wa
b260: 6e 74 54 6f 4c 6f 63 6b 3e 30 20 29 3b 0a 20 20  ntToLock>0 );.  
b270: 20 20 69 66 28 20 70 4c 61 74 65 72 2d 3e 6c 6f    if( pLater->lo
b280: 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  cked ){.      sq
b290: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
b2a0: 65 28 70 4c 61 74 65 72 2d 3e 70 42 74 2d 3e 6d  e(pLater->pBt->m
b2b0: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 4c 61  utex);.      pLa
b2c0: 74 65 72 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b  ter->locked = 0;
b2d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
b2e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b2f0: 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b  (p->pBt->mutex);
b300: 0a 20 20 66 6f 72 28 70 4c 61 74 65 72 3d 70 2d  .  for(pLater=p-
b310: 3e 70 4e 65 78 74 3b 20 70 4c 61 74 65 72 3b 20  >pNext; pLater; 
b320: 70 4c 61 74 65 72 3d 70 4c 61 74 65 72 2d 3e 70  pLater=pLater->p
b330: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
b340: 4c 61 74 65 72 2d 3e 77 61 6e 74 54 6f 4c 6f 63  Later->wantToLoc
b350: 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
b360: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
b370: 4c 61 74 65 72 2d 3e 70 42 74 2d 3e 6d 75 74 65  Later->pBt->mute
b380: 78 29 3b 0a 20 20 20 20 20 20 70 4c 61 74 65 72  x);.      pLater
b390: 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20  ->locked = 1;.  
b3a0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
b3b0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
b3c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
b3d0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 69 74 20 74 68 65  ../*.** Exit the
b3e0: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
b3f0: 20 6f 6e 20 61 20 42 74 72 65 65 2e 0a 2a 2f 0a   on a Btree..*/.
b400: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
b410: 44 53 41 46 45 20 26 26 20 21 64 65 66 69 6e 65  DSAFE && !define
b420: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
b430: 41 52 45 44 5f 43 41 43 48 45 29 0a 76 6f 69 64  ARED_CACHE).void
b440: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b450: 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
b460: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
b470: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b480: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3e 30 20 29  ->wantToLock>0 )
b490: 3b 0a 20 20 20 20 70 2d 3e 77 61 6e 74 54 6f 4c  ;.    p->wantToL
b4a0: 6f 63 6b 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ock--;.    if( p
b4b0: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
b4c0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b4d0: 20 70 2d 3e 6c 6f 63 6b 65 64 20 29 3b 0a 20 20   p->locked );.  
b4e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
b4f0: 78 5f 6c 65 61 76 65 28 70 2d 3e 70 42 74 2d 3e  x_leave(p->pBt->
b500: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  mutex);.      p-
b510: 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 20  >locked = 0;.   
b520: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
b530: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ..#if SQLITE_THR
b540: 45 41 44 53 41 46 45 20 26 26 20 21 64 65 66 69  EADSAFE && !defi
b550: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b560: 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a  SHARED_CACHE)./*
b570: 0a 2a 2a 20 53 68 6f 72 74 2d 63 75 74 73 20 66  .** Short-cuts f
b580: 6f 72 20 65 6e 74 65 72 69 6e 67 20 61 6e 64 20  or entering and 
b590: 6c 65 61 76 69 6e 67 20 6d 75 74 65 78 65 73 20  leaving mutexes 
b5a0: 6f 6e 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  on a cursor..*/.
b5b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72 73  static void curs
b5c0: 6f 72 4c 65 61 76 65 28 42 74 43 75 72 73 6f 72  orLeave(BtCursor
b5d0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 42   *p){.  sqlite3B
b5e0: 74 72 65 65 4c 65 61 76 65 28 70 2d 3e 70 42 74  treeLeave(p->pBt
b5f0: 72 65 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ree);.}.static v
b600: 6f 69 64 20 63 75 72 73 6f 72 45 6e 74 65 72 28  oid cursorEnter(
b610: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
b620: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
b630: 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65  nter(pCur->pBtre
b640: 65 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  e);.}.#else.# de
b650: 66 69 6e 65 20 63 75 72 73 6f 72 45 6e 74 65 72  fine cursorEnter
b660: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 63 75 72  (X).# define cur
b670: 73 6f 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64  sorLeave(X).#end
b680: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
b690: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
b6a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
b6b0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
b6c0: 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  r callback funct
b6d0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
b6e0: 74 65 33 42 74 72 65 65 53 65 74 42 75 73 79 48  te3BtreeSetBusyH
b6f0: 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a 70 2c  andler(Btree *p,
b700: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48   BusyHandler *pH
b710: 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53 68 61  andler){.  BtSha
b720: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
b730: 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
b740: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
b750: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
b760: 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c   pHandler;.  sql
b770: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
b780: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
b790: 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a  ger, pHandler);.
b7a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b7b0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
b7c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b7d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
b7e0: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
b7f0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
b800: 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
b810: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
b820: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
b830: 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
b840: 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
b850: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
b860: 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
b870: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
b880: 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
b890: 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
b8a0: 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
b8b0: 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
b8c0: 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
b8d0: 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
b8e0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
b8f0: 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
b900: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
b910: 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
b920: 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
b930: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
b940: 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
b950: 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
b960: 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
b970: 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
b980: 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
b990: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
b9a0: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
b9b0: 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
b9c0: 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
b9d0: 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
b9e0: 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
b9f0: 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
ba00: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
ba10: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
ba20: 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
ba30: 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
ba40: 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
ba50: 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
ba60: 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
ba70: 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
ba80: 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
ba90: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
baa0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
bab0: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
bac0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
bad0: 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
bae0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
baf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
bb00: 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
bb10: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
bb20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
bb30: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
bb40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bb50: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
bb60: 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
bb70: 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
bb80: 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
bb90: 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
bba0: 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
bbb0: 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
bbc0: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
bbd0: 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
bbe0: 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
bbf0: 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
bc00: 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
bc10: 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
bc20: 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
bc30: 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
bc40: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
bc50: 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
bc60: 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
bc70: 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
bc80: 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
bc90: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
bca0: 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
bcb0: 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
bcc0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
bcd0: 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
bce0: 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
bcf0: 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
bd00: 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
bd10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bd20: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
bd30: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
bd40: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
bd50: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
bd60: 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
bd70: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
bd80: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
bd90: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
bda0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
bdb0: 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
bdc0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
bdd0: 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a  vel, fullSync);.
bde0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
bdf0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
be00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
be10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
be20: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
be30: 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65  iven btree is se
be40: 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65  t to safety leve
be50: 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a  l 1.  In other.*
be60: 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  * words, return 
be70: 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28  TRUE if no sync(
be80: 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  ) occurs on the 
be90: 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  disk files..*/.i
bea0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
beb0: 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65  yncDisabled(Btre
bec0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
bed0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
bee0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
bef0: 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
bf00: 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 73 71 6c  >pPager );.  sql
bf10: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
bf20: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
bf30: 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74  3PagerNosync(pBt
bf40: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  ->pPager);.  sql
bf50: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
bf60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bf70: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
bf80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
bf90: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
bfa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bfb0: 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
bfc0: 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
bfd0: 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
bfe0: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
bff0: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
c000: 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  per page..**.** 
c010: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
c020: 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
c030: 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
c040: 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
c050: 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
c060: 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
c070: 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
c080: 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
c090: 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
c0a0: 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
c0b0: 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
c0c0: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
c0d0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
c0e0: 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
c0f0: 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
c100: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
c110: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
c120: 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
c130: 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
c140: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
c150: 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
c160: 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
c170: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
c180: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
c190: 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
c1a0: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
c1b0: 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
c1c0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
c1d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c1e0: 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
c1f0: 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
c200: 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  t unchanged..*/.
c210: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c220: 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
c230: 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
c240: 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
c250: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
c260: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
c270: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c280: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
c290: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
c2a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
c2b0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
c2c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
c2d0: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
c2e0: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
c2f0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
c300: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
c310: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
c320: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
c330: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
c340: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
c350: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
c360: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
c370: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
c380: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
c390: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
c3a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
c3b0: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
c3c0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
c3d0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c3e0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
c3f0: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
c400: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a  >pPager, pageSiz
c410: 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75  e);.  }.  pBt->u
c420: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
c430: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
c440: 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  erve;.  sqlite3B
c450: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c460: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c480: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
c490: 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
c4a0: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
c4b0: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
c4c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
c4d0: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
c4e0: 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  eSize;.}.int sql
c4f0: 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
c500: 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
c510: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
c520: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c530: 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
c540: 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
c550: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73  >usableSize;.  s
c560: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c570: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
c580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c590: 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
c5a0: 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
c5b0: 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
c5c0: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
c5d0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
c5e0: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
c5f0: 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
c600: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
c610: 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
c620: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
c630: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
c640: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
c650: 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
c660: 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
c670: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
c680: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
c690: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
c6a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
c6b0: 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
c6c0: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
c6d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
c6e0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c6f0: 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn n;.}.#endif 
c700: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
c710: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
c720: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
c730: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
c740: 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
c750: 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
c760: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
c770: 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
c780: 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
c790: 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
c7a0: 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
c7b0: 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
c7c0: 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
c7d0: 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
c7e0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
c7f0: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
c800: 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
c810: 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
c820: 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
c830: 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
c840: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
c850: 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
c860: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
c870: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
c880: 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
c890: 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
c8a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c8b0: 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
c8c0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
c8d0: 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
c8e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
c8f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c900: 4b 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61  K;.  int av = (a
c910: 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a  utoVacuum?1:0);.
c920: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
c930: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
c940: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
c950: 64 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75  d && av!=pBt->au
c960: 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
c970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
c980: 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
c990: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
c9a0: 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73  um = av;.  }.  s
c9b0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c9c0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c9d0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c9e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
c9f0: 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
ca00: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
ca10: 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
ca20: 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
ca30: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
ca40: 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
ca50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
ca60: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
ca70: 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
ca80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
ca90: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
caa0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
cab0: 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
cac0: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
cad0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
cae0: 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
caf0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
cb00: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
cb10: 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
cb20: 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
cb30: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
cb40: 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
cb50: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
cb60: 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
cb70: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
cb80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
cb90: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
cba0: 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
cbb0: 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
cbc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
cbd0: 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
cbe0: 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
cbf0: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
cc00: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
cc10: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
cc20: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
cc30: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
cc40: 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
cc50: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
cc60: 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
cc70: 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
cc80: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
cc90: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
cca0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
ccb0: 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
ccc0: 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
ccd0: 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
cce0: 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
ccf0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
cd00: 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
cd10: 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61  t){.  int rc, pa
cd20: 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67  geSize;.  MemPag
cd30: 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
cd40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
cd50: 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d  eeMutexHeld(pBt-
cd60: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
cd70: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72   pBt->pPage1 ) r
cd80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cd90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
cda0: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
cdb0: 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
cdc0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
cdd0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
cde0: 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f  ;.  ..  /* Do so
cdf0: 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
ce00: 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
ce10: 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
ce20: 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
ce30: 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
ce40: 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  le. .  */.  rc =
ce50: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
ce60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
ce70: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
ce80: 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20  >pPager)>0 ){.  
ce90: 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
cea0: 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
ceb0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
cec0: 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
ced0: 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
cee0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
cef0: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
cf00: 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
cf10: 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
cf20: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
cf30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
cf40: 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
cf50: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
cf60: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
cf70: 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
cf80: 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
cf90: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
cfa0: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
cfb0: 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
cfc0: 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 20  ize<512 ){.     
cfd0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
cfe0: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
cff0: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
d000: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
d010: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
d020: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
d030: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
d040: 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
d050: 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
d060: 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
d070: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
d080: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d090: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d0a0: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
d0b0: 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a  ac = page1[21];.
d0c0: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
d0d0: 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32  dFrac = page1[22
d0e0: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
d0f0: 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b  eafFrac = page1[
d100: 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  23];.#ifndef SQL
d110: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d120: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
d130: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
d140: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
d150: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
d160: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
d170: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
d180: 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
d190: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
d1a0: 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
d1b0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
d1c0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
d1d0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
d1e0: 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
d1f0: 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
d200: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
d210: 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
d220: 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
d230: 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
d240: 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
d250: 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
d260: 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
d270: 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
d280: 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
d290: 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
d2a0: 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
d2b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
d2c0: 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
d2d0: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
d2e0: 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
d2f0: 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
d300: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
d310: 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
d320: 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
d330: 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
d340: 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
d350: 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
d360: 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
d370: 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
d380: 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
d390: 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
d3a0: 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
d3b0: 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
d3c0: 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
d3d0: 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
d3e0: 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
d3f0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
d400: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
d410: 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65  12)*pBt->maxEmbe
d420: 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
d430: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
d440: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
d450: 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45  ze-12)*pBt->minE
d460: 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32  mbedFrac/255 - 2
d470: 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  3;.  pBt->maxLea
d480: 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  f = pBt->usableS
d490: 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d  ize - 35;.  pBt-
d4a0: 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d  >minLeaf = (pBt-
d4b0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
d4c0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
d4d0: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28  /255 - 23;.  if(
d4e0: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70   pBt->minLocal>p
d4f0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20  Bt->maxLocal || 
d500: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20  pBt->maxLocal<0 
d510: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
d520: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
d530: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
d540: 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
d550: 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
d560: 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
d570: 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
d580: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d590: 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
d5a0: 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
d5b0: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
d5c0: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
d5d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d5e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d5f0: 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c  ine works like l
d600: 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70  ockBtree() excep
d610: 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69  t that it also i
d620: 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75  nvokes the.** bu
d630: 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
d640: 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e  here is lock con
d650: 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  tention..*/.stat
d660: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
d670: 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20  WithRetry(Btree 
d680: 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pRef){.  int rc
d690: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
d6a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d6b0: 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
d6c0: 52 65 66 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  Ref->pSqlite->mu
d6d0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
d6e0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
d6f0: 74 65 78 48 65 6c 64 28 70 52 65 66 2d 3e 70 42  texHeld(pRef->pB
d700: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
d710: 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73  f( pRef->inTrans
d720: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
d730: 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63      u8 inTransac
d740: 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74  tion = pRef->pBt
d750: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  ->inTransaction;
d760: 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
d770: 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72  ity(pRef);.    r
d780: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d790: 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c  BeginTrans(pRef,
d7a0: 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70   0);.    pRef->p
d7b0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
d7c0: 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f  n = inTransactio
d7d0: 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54  n;.    pRef->inT
d7e0: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
d7f0: 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  E;.    if( rc==S
d800: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d810: 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72    pRef->pBt->nTr
d820: 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
d830: 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65   }.    btreeInte
d840: 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d  grity(pRef);.  }
d850: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d860: 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49         ../*.** I
d870: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
d880: 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
d890: 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
d8a0: 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
d8b0: 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
d8c0: 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
d8d0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
d8e0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
d8f0: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
d900: 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
d910: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
d920: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
d930: 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
d940: 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
d950: 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
d960: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
d970: 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61  e are any outsta
d980: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74  nding cursors, t
d990: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
d9a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
d9b0: 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
d9c0: 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
d9d0: 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
d9e0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
d9f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
da00: 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
da10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
da20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
da30: 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
da40: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
da50: 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
da60: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
da70: 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75  NONE && pBt->pCu
da80: 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e  rsor==0 && pBt->
da90: 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
daa0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
dab0: 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
dac0: 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20  Pager)>=1 ){.   
dad0: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67     if( pBt->pPag
dae0: 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a  e1->aData==0 ){.
daf0: 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
db00: 2a 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50  *pPage = pBt->pP
db10: 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50  age1;.        pP
db20: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 26 28 28  age->aData = &((
db30: 75 38 2a 29 70 50 61 67 65 29 5b 2d 70 42 74 2d  u8*)pPage)[-pBt-
db40: 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20  >pageSize];.    
db50: 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
db60: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50   pBt;.        pP
db70: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  age->pgno = 1;. 
db80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
db90: 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
dba0: 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
dbb0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
dbc0: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
dbd0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
dbe0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
dbf0: 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
dc00: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
dc10: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
dc20: 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
dc30: 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
dc40: 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
dc50: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
dc60: 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
dc70: 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
dc80: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
dc90: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
dca0: 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  Held(pBt->mutex)
dcb0: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
dcc0: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
dcd0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
dce0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dcf0: 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  K;.  pP1 = pBt->
dd00: 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
dd10: 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
dd20: 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
dd30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
dd40: 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
dd50: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
dd60: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
dd70: 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
dd80: 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
dd90: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
dda0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
ddb0: 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
ddc0: 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
ddd0: 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
dde0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
ddf0: 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
de00: 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
de10: 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d   data[20] = pBt-
de20: 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
de30: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
de40: 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d  ata[21] = pBt->m
de50: 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  axEmbedFrac;.  d
de60: 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d  ata[22] = pBt->m
de70: 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  inEmbedFrac;.  d
de80: 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d  ata[23] = pBt->m
de90: 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d 65  inLeafFrac;.  me
dea0: 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
deb0: 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
dec0: 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
ded0: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
dee0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
def0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
df00: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
df10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
df20: 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
df30: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
df40: 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
df50: 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
df60: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
df70: 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
df80: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
df90: 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
dfa0: 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
dfb0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
dfc0: 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
dfd0: 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
dfe0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
dff0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
e000: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e010: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
e020: 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
e030: 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
e040: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
e050: 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
e060: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
e070: 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
e080: 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
e090: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
e0a0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
e0b0: 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
e0c0: 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
e0d0: 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
e0e0: 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
e0f0: 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
e100: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
e110: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
e120: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
e130: 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
e140: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
e150: 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
e160: 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
e170: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
e180: 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
e190: 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
e1a0: 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
e1b0: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
e1c0: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
e1d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
e1e0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
e1f0: 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
e200: 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
e210: 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
e220: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
e230: 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
e240: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
e250: 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
e260: 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
e270: 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
e280: 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
e290: 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
e2a0: 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
e2b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
e2c0: 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
e2d0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e2e0: 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
e2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e300: 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
e310: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e320: 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
e330: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
e340: 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
e350: 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
e360: 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
e370: 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
e380: 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
e390: 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
e3a0: 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
e3b0: 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
e3c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
e3d0: 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
e3e0: 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
e3f0: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
e400: 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
e410: 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
e420: 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
e430: 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
e440: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
e450: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
e460: 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
e470: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
e480: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
e490: 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
e4a0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
e4b0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
e4c0: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
e4d0: 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
e4e0: 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
e4f0: 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
e500: 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
e510: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
e520: 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
e530: 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
e540: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
e550: 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
e560: 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
e570: 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
e580: 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
e590: 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
e5a0: 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
e5b0: 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
e5c0: 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
e5d0: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
e5e0: 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
e5f0: 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
e600: 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
e610: 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
e620: 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
e630: 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
e640: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
e650: 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
e660: 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
e670: 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
e680: 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
e690: 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
e6a0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
e6b0: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
e6c0: 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
e6d0: 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
e6e0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
e6f0: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
e700: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
e710: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
e720: 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
e730: 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
e740: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
e750: 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
e760: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
e770: 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
e780: 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
e790: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
e7a0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
e7b0: 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
e7c0: 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
e7d0: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
e7e0: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
e7f0: 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
e800: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
e810: 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
e820: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
e830: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
e840: 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
e850: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
e860: 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
e870: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
e880: 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
e890: 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
e8a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
e8b0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
e8c0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
e8d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
e8e0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
e8f0: 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
e900: 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
e910: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
e920: 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
e930: 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
e940: 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
e950: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e960: 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
e970: 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
e980: 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  E_BUSY..  */.  i
e990: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
e9a0: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
e9b0: 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  TE && wrflag ){.
e9c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e9d0: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  BUSY;.    goto t
e9e0: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
e9f0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20  .  do {.    if( 
ea00: 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
ea10: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
ea20: 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
ea30: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
ea40: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
ea50: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
ea60: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
ea70: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
ea80: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
ea90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eaa0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
eab0: 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
eac0: 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
ead0: 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20  , wrflag>1);.   
eae0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
eaf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
eb00: 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
eb10: 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
eb20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
eb30: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
eb40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
eb50: 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20       if( wrflag 
eb60: 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  ) pBt->inStmt = 
eb70: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
eb80: 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
eb90: 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
eba0: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
ebb0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
ebc0: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
ebd0: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
ebe0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  &&.          sql
ebf0: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
ec00: 6e 64 6c 65 72 28 70 42 74 2d 3e 70 42 75 73 79  ndler(pBt->pBusy
ec10: 48 61 6e 64 6c 65 72 29 20 29 3b 0a 0a 20 20 69  Handler) );..  i
ec20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ec30: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
ec40: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
ec50: 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
ec60: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
ec70: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
ec80: 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
ec90: 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
eca0: 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
ecb0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
ecc0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
ecd0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
ece0: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
ecf0: 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
ed00: 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
ed10: 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  :.  btreeIntegri
ed20: 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
ed30: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
ed40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
ed50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ed60: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
ed70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
ed80: 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
ed90: 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
eda0: 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
edb0: 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
edc0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
edd0: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
ede0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
edf0: 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
ee00: 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
ee10: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
ee20: 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
ee30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
ee40: 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
ee50: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
ee60: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
ee90: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
eea0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
eed0: 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
eee0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
ef10: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
ef20: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
ef30: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73  e->pBt;.  int is
ef40: 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
ef50: 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
ef60: 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
ef70: 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
ef80: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
ef90: 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  xHeld(pPage->pBt
efa0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
efb0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
efc0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
efd0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  Page->pParent);.
efe0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
eff0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
f000: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f010: 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
f020: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
f030: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
f040: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
f050: 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
f060: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
f070: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ;..    rc = ptrm
f080: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
f090: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
f0a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f0b0: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
f0c0: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f0d0: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  s_out;.    }..  
f0e0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
f0f0: 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
f100: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
f110: 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
f120: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
f130: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
f140: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
f150: 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
f160: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f170: 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64  ) goto set_child
f180: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
f190: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
f1a0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
f1b0: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
f1c0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&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 29 3b  ->hdrOffset+8]);
f1f0: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
f200: 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
f210: 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
f220: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65  , pgno);.  }..se
f230: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f240: 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
f250: 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
f260: 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
f270: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
f280: 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69  re on pPage, whi
f290: 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  ch is guarenteed
f2a0: 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70   to be a btree p
f2b0: 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72  age, not an over
f2c0: 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73  flow.** page, is
f2d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
f2e0: 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79  ge iFrom. Modify
f2f0: 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
f300: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
f310: 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d  to.** iTo. Param
f320: 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
f330: 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
f340: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d   pointer to be m
f350: 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20  odified, as .** 
f360: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
f370: 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
f380: 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
f390: 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
f3a0: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
f3b0: 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
f3d0: 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
f3e0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
f3f0: 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
f400: 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
f410: 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
f420: 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
f450: 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
f460: 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
f470: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
f480: 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
f490: 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
f4a0: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
f4b0: 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
f4c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f4d0: 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
f4e0: 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
f4f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
f500: 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
f510: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
f520: 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
f530: 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
f540: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
f550: 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c  te3BtreeMutexHel
f560: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
f570: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54  tex) );.  if( eT
f580: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
f590: 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
f5a0: 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
f5b0: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
f5c0: 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
f5d0: 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
f5e0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
f5f0: 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
f600: 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
f610: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f620: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f630: 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
f640: 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
f650: 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
f660: 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
f670: 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
f680: 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
f690: 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
f6a0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f6b0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
f6c0: 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  0);.    nCell = 
f6d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
f6e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
f6f0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
f700: 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
f710: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
f720: 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
f730: 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
f740: 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
f750: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
f760: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f770: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
f780: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
f790: 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
f7a0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
f7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
f7c0: 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
f7d0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
f7e0: 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20  rflow]) ){.     
f7f0: 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
f800: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
f810: 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
f820: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f830: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f850: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
f860: 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
f870: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
f880: 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
f890: 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
f8a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f8b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f8c0: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
f8d0: 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
f8e0: 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
f8f0: 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
f900: 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
f910: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
f920: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
f930: 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
f940: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f950: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
f970: 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
f980: 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
f990: 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
f9a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
f9b0: 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
f9c0: 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
f9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f9e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
f9f0: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
fa00: 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
fa10: 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
fa20: 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
fa30: 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
fa40: 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
fa50: 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a  mains valid..*/.
fa60: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
fa70: 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
fa80: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
fa90: 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
faa0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
fab0: 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
fac0: 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
fad0: 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
faf0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
fb00: 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
fb10: 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
fb20: 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
fb30: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
fb40: 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
fb50: 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
fb60: 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
fb70: 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
fb80: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
fb90: 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
fba0: 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
fbb0: 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
fbc0: 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
fbd0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
fbe0: 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
fbf0: 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
fc00: 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
fc10: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
fc20: 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
fc30: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
fc40: 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
fc50: 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
fc60: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
fc70: 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
fc80: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
fc90: 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
fca0: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
fcb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fcc0: 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
fcd0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
fce0: 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
fcf0: 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 27  iDbPage from it'
fd00: 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
fd10: 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
fd20: 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
fd30: 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
fd40: 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
fd50: 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
fd60: 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
fd70: 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
fd80: 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
fd90: 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
fda0: 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
fdb0: 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
fdc0: 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
fdd0: 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
fde0: 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  eePage);.  if( r
fdf0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fe00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fe10: 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
fe20: 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
fe30: 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
fe40: 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
fe50: 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
fe60: 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
fe70: 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
fe80: 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
fe90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
fea0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
feb0: 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
fec0: 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
fed0: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
fee0: 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
fef0: 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
ff00: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
ff10: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
ff20: 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
ff30: 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
ff40: 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
ff50: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
ff60: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
ff70: 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
ff80: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
ff90: 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
ffa0: 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
ffb0: 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
ffc0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
ffd0: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
ffe0: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
fff0: 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
10000 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
10010 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
10020 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10040 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10050 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
10060 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
10070 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
10080 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
10090 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
100a0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
100b0 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
100c0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
100d0 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29  LOW2, iFreePage)
100e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
100f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10100 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10120 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
10130 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
10140 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
10150 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
10160 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
10170 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
10180 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
10190 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
101a0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
101b0 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
101c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
101d0 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
101e0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
101f0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
10200 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
10210 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
10220 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10250 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10260 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
10270 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
10280 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
102a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
102b0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
102c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
102d0 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
102e0 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
102f0 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
10300 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
10310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
10320 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
10330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10340 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
10350 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
10360 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
10370 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  trPage);.    }. 
10380 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10390 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
103a0 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
103b0 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
103c0 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
103d0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
103e0 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
103f0 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
10400 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
10410 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
10420 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
10430 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
10440 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
10450 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75  cessful,.** retu
10460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
10470 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
10480 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
10490 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69  refore no.** poi
104a0 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68  nt in calling th
104b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
104c0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
104d0 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  E_DONE..**.** Mo
104e0 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
104f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
10500 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
10510 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74  nize the .** dat
10520 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68  abase so that th
10530 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
10540 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
10550 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e  y in use.** is n
10560 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
10570 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46  .**.** If the nF
10580 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  in parameter is 
10590 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d  non-zero, the im
105a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73  plementation ass
105b0 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
105c0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
105d0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
105e0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
105f0 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
10600 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
10610 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
10620 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
10630 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
10640 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10650 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
10660 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
10670 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
10680 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10690 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
106a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
106b0 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e  gno nFin){.  Pgn
106c0 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20  o iLastPg;      
106d0 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
106e0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
106f0 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  ase */.  Pgno nF
10700 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
10710 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10720 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
10730 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
10740 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10750 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
10760 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10770 20 20 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d    iLastPg = pBt-
10780 3e 6e 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69  >nTrunc;.  if( i
10790 4c 61 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20  LastPg==0 ){.   
107a0 20 69 4c 61 73 74 50 67 20 3d 20 73 71 6c 69 74   iLastPg = sqlit
107b0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
107c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
107d0 20 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41   }..  if( !PTRMA
107e0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
107f0 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
10800 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
10810 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
10820 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20   int rc;.    u8 
10830 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
10840 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
10850 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
10860 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
10870 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
10880 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
10890 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73  =0 || nFin==iLas
108a0 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74  tPg ){.      ret
108b0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
108c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
108d0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
108e0 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
108f0 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
10900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10910 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
10920 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
10930 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
10940 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
10950 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10960 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
10970 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10980 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
10990 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
109a0 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
109b0 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
109c0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
109d0 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
109e0 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
109f0 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
10a00 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
10a10 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
10a20 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
10a30 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
10a40 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
10a50 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
10a60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10a70 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
10a80 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
10a90 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
10aa0 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
10ab0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
10ac0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
10ad0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
10ae0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
10af0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
10b00 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
10b10 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
10b20 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
10b30 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
10b40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
10b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10b60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10b70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
10b80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
10b90 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
10ba0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
10bb0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
10bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
10bd0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
10be0 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
10bf0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
10c00 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
10c10 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
10c20 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
10c30 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
10c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10c50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
10c60 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
10c70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
10c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10c90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10ca0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
10cb0 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73     /* If nFin is
10cc0 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
10cd0 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
10ce0 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
10cf0 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
10d00 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
10d10 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
10d20 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
10d30 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
10d40 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
10d50 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
10d60 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74  if nFin is great
10d70 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
10d80 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
10d90 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
10da0 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
10db0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
10dc0 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
10dd0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
10de0 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
10df0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
10e00 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
10e10 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
10e20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
10e30 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
10e40 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
10e50 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Pg, 0, 0);.     
10e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10e80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
10e90 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
10ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
10ec0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
10ed0 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
10ee0 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46  e( nFin!=0 && iF
10ef0 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
10f00 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
10f10 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
10f20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
10f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
10f40 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50  te(pLastPg->pDbP
10f50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
10f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10f70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10f80 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20  rc;.      } .   
10f90 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
10fa0 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
10fb0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
10fc0 67 65 2c 20 69 46 72 65 65 50 67 29 3b 0a 20 20  ge, iFreePg);.  
10fd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
10fe0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
10ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11000 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
11010 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20  urn rc;.      } 
11020 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42  .    }.  }..  pB
11030 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73  t->nTrunc = iLas
11040 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65  tPg - 1;.  while
11050 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50  ( pBt->nTrunc==P
11060 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
11070 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
11080 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
11090 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42  Trunc) ){.    pB
110a0 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d  t->nTrunc--;.  }
110b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
110c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
110d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
110e0 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
110f0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
11100 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
11110 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
11120 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
11130 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
11140 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
11150 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
11160 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
11170 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
11180 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
11190 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
111a0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
111b0 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
111c0 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
111d0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
111e0 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
111f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
11200 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
11210 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
11220 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11230 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
11240 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
11250 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
11260 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
11270 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11280 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
11290 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
112a0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
112b0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
112c0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
112d0 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
112e0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
112f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
11300 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c  }else{.    inval
11310 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
11320 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
11330 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
11340 74 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d  tep(pBt, 0);.  }
11350 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11360 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11370 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11380 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11390 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
113a0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
113b0 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
113c0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
113d0 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
113e0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
113f0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
11400 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
11410 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
11420 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
11430 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
11440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11450 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
11460 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
11470 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
11480 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
11490 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
114a0 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
114b0 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
114c0 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
114d0 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
114e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
114f0 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
11500 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
11510 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29  , Pgno *pnTrunc)
11520 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11530 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
11540 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
11550 50 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e  Pager;.#ifndef N
11560 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66  DEBUG.  int nRef
11570 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
11580 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  efcount(pPager);
11590 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
115a0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
115b0 75 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75  utexHeld(pBt->mu
115c0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
115d0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
115e0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
115f0 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
11600 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
11610 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
11620 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
11630 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74 2d  0;..    if( pBt-
11640 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20  >nTrunc==0 ){.  
11650 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a      Pgno nFree;.
11660 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d        Pgno nPtrm
11670 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ap;.      const 
11680 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e  int pgsz = pBt->
11690 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
116a0 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 73 71 6c  Pgno nOrig = sql
116b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
116c0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
116d0 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  ..      if( PTRM
116e0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
116f0 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20 20  Orig) ){.       
11700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11710 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11720 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
11730 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
11740 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
11750 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d 3b          nOrig--;
11760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
11770 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
11780 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
11790 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20  ata[36]);.      
117a0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
117b0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
117c0 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
117d0 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35  +pgsz/5)/(pgsz/5
117e0 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d 20  );.      nFin = 
117f0 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
11800 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 69  nPtrmap;.      i
11810 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
11820 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
11830 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47  && nFin<=PENDING
11840 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
11850 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d  ){.        nFin-
11860 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
11870 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
11880 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
11890 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
118a0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
118b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e   ){.        nFin
118c0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
118d0 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  }..    while( rc
118e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
118f0 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
11900 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
11910 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
11920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
11930 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  NE ){.      asse
11940 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70 42  rt(nFin==0 || pB
11950 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c 20  t->nTrunc==0 || 
11960 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e  nFin<=pBt->nTrun
11970 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  c);.      rc = S
11980 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
11990 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
119a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
119b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
119c0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
119d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
119e0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
119f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
11a00 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
11a10 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
11a20 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
11a30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
11a40 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b  ->nTrunc = nFin;
11a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11a60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11a80 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
11a90 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
11aa0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
11ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11ac0 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74    *pnTrunc = pBt
11ad0 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42  ->nTrunc;.    pB
11ae0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20  t->nTrunc = 0;. 
11af0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
11b00 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
11b10 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
11b20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11b30 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  }..#endif../*.**
11b40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
11b50 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
11b60 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
11b70 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
11b80 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
11b90 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
11ba0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
11bb0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
11bc0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
11bd0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
11be0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
11bf0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
11c00 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
11c10 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
11c20 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
11c30 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11c40 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
11c50 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
11c60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
11c70 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
11c80 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
11c90 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
11ca0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
11cb0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
11cc0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
11cd0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
11ce0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
11cf0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
11d00 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
11d10 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
11d20 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
11d30 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
11d40 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
11d50 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
11d60 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
11d70 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
11d80 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
11d90 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
11da0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
11db0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
11dc0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
11dd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11de0 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  it() for the sec
11df0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
11e00 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
11e10 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
11e20 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
11e30 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
11e40 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
11e50 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
11e60 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
11e70 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
11e80 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
11e90 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
11ea0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
11eb0 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
11ec0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ed0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
11ee0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
11ef0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
11f00 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
11f10 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
11f20 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
11f30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
11f40 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
11f50 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
11f60 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
11f70 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
11f80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11f90 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
11fa0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
11fb0 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
11fc0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
11fd0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
11fe0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
11ff0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
12000 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
12010 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
12020 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
12030 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
12040 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
12050 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
12060 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
12070 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
12080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12090 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
120a0 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
120b0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
120c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
120d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
120e0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
120f0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
12100 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
12110 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20  ->pBt;.    Pgno 
12120 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20  nTrunc = 0;.    
12130 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12140 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
12150 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12160 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
12170 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
12180 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
12190 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c  acuumCommit(pBt,
121a0 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20   &nTrunc); .    
121b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
121c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
121d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
121e0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
121f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
12200 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12220 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
12230 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
12240 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  aster, nTrunc);.
12250 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12260 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
12270 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12280 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
12290 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
122a0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
122b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
122c0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
122d0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
122e0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
122f0 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
12300 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
12310 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
12320 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
12330 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  d should be invo
12340 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ked.** prior to 
12350 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
12360 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
12370 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
12380 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c  utine did.** all
12390 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
123a0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
123b0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
123c0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
123d0 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
123e0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
123f0 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
12400 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
12410 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
12420 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
12430 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
12440 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12450 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61  nal.** (which ca
12460 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
12470 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
12480 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  and drop locks..
12490 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
124a0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
124b0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
124c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
124d0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
124e0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
124f0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
12500 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
12510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12520 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
12530 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
12540 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12550 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
12560 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12570 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
12580 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
12590 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
125a0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
125b0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
125c0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
125d0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
125e0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
125f0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
12600 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
12610 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12620 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
12630 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
12640 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
12650 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
12660 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
12670 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
12680 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
12690 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
126a0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
126b0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
126c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
126d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
126e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
126f0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
12700 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12710 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
12720 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
12730 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
12740 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c  t = 0;.  }.  unl
12750 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
12760 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
12770 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e  ndle has any kin
12780 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
12790 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
127a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
127b0 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74  .  ** count of t
127c0 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
127d0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
127e0 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65  ion count reache
127f0 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  s 0, set.  ** th
12800 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
12810 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
12820 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
12830 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c  nused() call bel
12840 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c  ow.  ** will unl
12850 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20  ock the pager.. 
12860 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
12870 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
12880 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   ){.    pBt->nTr
12890 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
128a0 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
128b0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
128c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
128d0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
128e0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
128f0 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64   /* Set the hand
12900 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e  les current tran
12910 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
12920 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
12930 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20  unlock.  ** the 
12940 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
12950 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
12960 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
12970 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
12980 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  */.  p->inTrans 
12990 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
129a0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
129b0 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
129c0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
129d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
129e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
129f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12a00 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
12a10 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
12a20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12a30 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
12a40 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
12a50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12a60 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
12a70 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
12a80 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
12a90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
12aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
12ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12ac0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
12ad0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
12ae0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12af0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
12b00 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
12b10 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12b20 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
12b30 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
12b40 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
12b50 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
12b60 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
12b70 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
12b80 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
12b90 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
12ba0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
12bb0 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
12bc0 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
12bd0 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
12be0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
12bf0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
12c00 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
12c10 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
12c20 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
12c30 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
12c40 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
12c50 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
12c60 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
12c70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12c80 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
12c90 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
12ca0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
12cb0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
12cc0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
12cd0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
12ce0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
12cf0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
12d00 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
12d10 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
12d20 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
12d30 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
12d40 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
12d50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
12d60 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
12d70 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
12d80 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
12d90 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
12da0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
12db0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12dc0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
12dd0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
12de0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12df0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
12e00 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
12e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12e20 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61  er(p);.  rc = sa
12e30 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
12e40 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
12e50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
12e60 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
12e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12e80 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
12e90 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
12ea0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
12eb0 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
12ec0 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  cured whilst.   
12ed0 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
12ee0 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
12ef0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
12f00 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
12f10 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
12f20 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
12f30 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
12f40 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
12f50 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
12f60 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
12f70 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
12f80 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
12f90 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
12fa0 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
12fb0 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
12fc0 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
12fd0 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
12fe0 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
12ff0 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
13000 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
13010 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
13020 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
13030 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
13040 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  e..    */.    wh
13050 69 6c 65 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ile( pBt->pCurso
13060 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
13070 65 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e 70 43  e3 *db = pBt->pC
13080 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 70  ursor->pBtree->p
13090 53 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66  Sqlite;.      if
130a0 28 20 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  ( db ){.        
130b0 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65  sqlite3AbortOthe
130c0 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62 2c  rActiveVdbes(db,
130d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
130e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
130f0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
13100 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  );.  unlockAllTa
13110 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20  bles(p);..  if( 
13120 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13130 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
13140 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66  nt rc2;..#ifndef
13150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13160 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
13170 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e  >nTrunc = 0;.#en
13180 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28  dif..    assert(
13190 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
131a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
131b0 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
131c0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
131d0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
131e0 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
131f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13200 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
13210 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
13220 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
13230 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
13240 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
13250 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
13260 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  l sqlite3BtreeGe
13270 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
13280 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
13290 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
132a0 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
132b0 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
132c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
132d0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
132e0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
132f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13300 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
13310 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
13320 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
13330 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
13340 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
13350 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
13360 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
13370 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
13380 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
13390 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
133a0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
133b0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   );.    pBt->nTr
133c0 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
133d0 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
133e0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
133f0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
13400 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
13410 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
13420 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
13430 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d  ANS_NONE;.  pBt-
13440 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75  >inStmt = 0;.  u
13450 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
13460 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
13470 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
13480 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13490 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
134a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
134b0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
134c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  ubtransaction.  
134d0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
134e0 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65  on can.** can be
134f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64   rolled back ind
13500 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
13510 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
13520 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20  on..** You must 
13530 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
13540 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74  ion before start
13550 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
13560 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62  tion..** The sub
13570 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
13580 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
13590 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ly if the main t
135a0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f  ransaction.** co
135b0 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
135c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ack..**.** Only 
135d0 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  one subtransacti
135e0 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
135f0 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20   at a time.  It 
13600 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74  is an error to t
13610 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61  ry.** to start a
13620 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74   new subtransact
13630 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73  ion if another s
13640 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
13650 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
13660 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
13670 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
13680 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
13690 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
136a0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
136b0 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
136c0 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
136d0 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
136e0 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
136f0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
13700 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
13710 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
13720 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
13730 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
13740 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
13750 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
13760 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
13770 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
13780 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13790 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
137a0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
137b0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
137c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
137d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
137e0 28 70 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69  (p);.  if( (p->i
137f0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
13800 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53  ITE) || pBt->inS
13810 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  tmt ){.    rc = 
13820 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
13830 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
13840 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
13850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
13860 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
13870 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
13880 52 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20 3d  RITE );.    rc =
13890 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
138a0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
138b0 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
138c0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  in(pBt->pPager);
138d0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
138e0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
138f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13900 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13910 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  .../*.** Commit 
13920 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62  the statment sub
13930 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
13940 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
13950 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62  s.  If no.** sub
13960 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
13970 63 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61  ctive, this is a
13980 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
13990 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
139a0 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  tStmt(Btree *p){
139b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
139c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
139d0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
139e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
139f0 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26  f( pBt->inStmt &
13a00 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
13a10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13a20 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
13a30 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  mit(pBt->pPager)
13a40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
13a50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13a60 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74   }.  pBt->inStmt
13a70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 0;.  sqlite3B
13a80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13a90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13aa0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
13ab0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
13ac0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
13ad0 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e  .  If no subtran
13ae0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63  saction.** is ac
13af0 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e  tive this routin
13b00 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
13b10 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
13b20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
13b30 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ted by this oper
13b40 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
13b50 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20  mpt.** to use a 
13b60 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20  cursor that was 
13b70 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
13b80 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
13b90 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  eration.** will 
13ba0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
13bb0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
13bc0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
13bd0 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
13be0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13bf0 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
13c00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13c10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13c20 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
13c30 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29  MallocDisallow()
13c40 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53  ;.  if( pBt->inS
13c50 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61  tmt && !pBt->rea
13c60 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20  dOnly ){.    rc 
13c70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
13c80 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  mtRollback(pBt->
13c90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
13ca0 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
13cb0 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
13cc0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
13cd0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 0;.  }.  sql
13ce0 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28  ite3MallocAllow(
13cf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13d00 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13d10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13d20 20 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d   Default key com
13d30 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
13d40 20 74 6f 20 62 65 20 75 73 65 64 20 69 66 20 6e   to be used if n
13d50 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
13d60 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63  ction.** is spec
13d70 69 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71 6c  ified on the sql
13d80 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
13d90 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ) call..*/.stati
13da0 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72  c int dfltCompar
13db0 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
13dc0 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ed,             
13dd0 2f 2a 20 55 73 65 72 20 64 61 74 61 20 69 73 20  /* User data is 
13de0 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e  not used */.  in
13df0 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t n1, const void
13e00 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72 73   *p1,    /* Firs
13e10 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65  t key to compare
13e20 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f   */.  int n2, co
13e30 6e 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20 20  nst void *p2    
13e40 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20 74   /* Second key t
13e50 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a  o compare */.){.
13e60 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d    int c;.  c = m
13e70 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31  emcmp(p1, p2, n1
13e80 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a  <n2 ? n1 : n2);.
13e90 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
13ea0 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20    c = n1 - n2;. 
13eb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d   }.  return c;.}
13ec0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
13ed0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
13ee0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
13ef0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
13f00 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20  age.** iTable.  
13f10 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69  The act of acqui
13f20 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65  ring a cursor ge
13f30 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ts a read lock o
13f40 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
13f50 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
13f60 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
13f70 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
13f80 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
13f90 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
13fa0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
13fb0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
13fc0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
13fd0 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
13fe0 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
13ff0 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
14000 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
14010 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
14020 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
14030 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
14040 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
14050 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
14060 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
14070 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
14080 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
14090 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
140a0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
140b0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
140c0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
140d0 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
140e0 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
140f0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
14100 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
14110 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
14120 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
14130 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
14140 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
14150 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
14160 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
14170 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
14180 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
14190 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
141a0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
141b0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
141c0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
141d0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
141e0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
141f0 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
14200 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
14210 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
14220 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
14230 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
14240 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
14250 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
14260 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
14270 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
14280 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
14290 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
142a0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
142b0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
142c0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
142d0 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
142e0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
142f0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
14300 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
14310 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
14320 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65 20  e logically the 
14330 73 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20 63  same for every c
14340 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61  ursor.** on a pa
14350 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
14360 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63 6f   Changing the co
14370 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
14380 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a  n will result.**
14390 20 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 70   in incorrect op
143a0 65 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74 68  erations.  If th
143b0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
143c0 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61  ction is NULL, a
143d0 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d 70  .** default comp
143e0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
143f0 69 73 20 75 73 65 64 2e 20 20 54 68 65 20 63 6f  is used.  The co
14400 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
14410 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69  n is.** always i
14420 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b 45  gnored for INTKE
14430 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  Y tables..*/.sta
14440 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
14450 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
14490 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
144d0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
144e0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
14520 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
14530 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64  int (*xCmp)(void
14540 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
14550 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
14560 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61  *), /* Key Compa
14570 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20  rison func */.  
14580 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20  void *pArg,     
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
145b0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
145c0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
145d0 72 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20  rsor **ppCur    
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
14600 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
14610 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
14620 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14630 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  r;.  BtShared *p
14640 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
14650 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
14660 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42  treeMutexHeld(pB
14670 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2a  t->mutex) );.  *
14680 70 70 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28  ppCur = 0;.  if(
14690 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69   wrFlag ){.    i
146a0 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
146b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
146c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
146d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
146e0 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
146f0 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
14700 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14710 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
14720 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
14730 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
14740 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
14750 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
14760 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14770 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
14780 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
14790 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
147a0 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29  Only && wrFlag )
147b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
147c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
147d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
147e0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
147f0 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 43  Zero( sizeof(*pC
14800 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
14810 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
14820 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14830 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
14840 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
14850 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
14860 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
14870 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62  able;.  if( iTab
14880 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  le==1 && sqlite3
14890 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
148a0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29  Bt->pPager)==0 )
148b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
148c0 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74  E_EMPTY;.    got
148d0 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
148e0 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
148f0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
14900 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
14910 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
14920 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  >pPage, 0);.  if
14930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14940 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  ){.    goto crea
14950 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
14960 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ion;.  }..  /* N
14970 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
14980 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
14990 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
149a0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
149b0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
149c0 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  , link the curso
149d0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
149e0 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74  red list and set
149f0 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a   *ppCur (the.  *
14a00 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  * output argumen
14a10 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
14a20 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  on)..  */.  pCur
14a30 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d  ->xCompare = xCm
14a40 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43  p ? xCmp : dfltC
14a50 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e  ompare;.  pCur->
14a60 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70  pArg = pArg;.  p
14a70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
14a80 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
14a90 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  = wrFlag;.  pCur
14aa0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
14ab0 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
14ac0 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
14ad0 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
14ae0 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
14af0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
14b00 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
14b10 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
14b20 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72  NVALID;.  *ppCur
14b30 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75   = pCur;..  retu
14b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63  rn SQLITE_OK;..c
14b50 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
14b60 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43  eption:.  if( pC
14b70 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  ur ){.    releas
14b80 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
14b90 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
14ba0 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a  free(pCur);.  }.
14bb0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
14bc0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
14bd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
14be0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
14bf0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
14c30 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14c60 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
14c70 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
14c80 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14cb0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
14cc0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  ead-only */.  in
14cd0 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c  t (*xCmp)(void*,
14ce0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
14cf0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
14d00 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69  , /* Key Compari
14d10 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f  son func */.  vo
14d20 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  id *pArg,       
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
14d50 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
14d60 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
14d70 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20  or **ppCur      
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d90 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
14da0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
14db0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
14dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14dd0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
14de0 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
14df0 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 78 43 6d  ble, wrFlag, xCm
14e00 70 2c 20 70 41 72 67 2c 20 70 70 43 75 72 29 3b  p, pArg, ppCur);
14e10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14e20 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14e30 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
14e40 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
14e50 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
14e60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14e70 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
14e80 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
14e90 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
14ea0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
14eb0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
14ec0 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
14ed0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
14ee0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
14ef0 65 2d 3e 70 42 74 3b 0a 0a 20 20 63 75 72 73 6f  e->pBt;..  curso
14f00 72 45 6e 74 65 72 28 70 43 75 72 29 3b 0a 20 20  rEnter(pCur);.  
14f10 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
14f20 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
14f30 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pCur->pPrev ){.
14f40 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
14f50 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
14f60 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
14f70 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
14f80 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
14f90 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70   }.  if( pCur->p
14fa0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
14fb0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
14fc0 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
14fd0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
14fe0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
14ff0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15000 73 65 64 28 70 42 74 29 3b 0a 20 20 69 6e 76 61  sed(pBt);.  inva
15010 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
15020 63 68 65 28 70 43 75 72 29 3b 0a 20 20 63 75 72  che(pCur);.  cur
15030 73 6f 72 4c 65 61 76 65 28 70 43 75 72 29 3b 0a  sorLeave(pCur);.
15040 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15050 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Cur);.  return S
15060 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15070 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72  ** Make a tempor
15080 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69  ary cursor by fi
15090 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65  lling in the fie
150a0 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e  lds of pTempCur.
150b0 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72  .** The temporar
150c0 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  y cursor is not 
150d0 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69  on the cursor li
150e0 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65  st for the Btree
150f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15100 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
15110 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
15120 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54  ur, BtCursor *pT
15130 65 6d 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70  empCur){.  memcp
15140 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
15150 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
15160 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
15170 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
15180 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
15190 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
151a0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 63 75 72  pPage ){.    cur
151b0 73 6f 72 45 6e 74 65 72 28 70 43 75 72 29 3b 0a  sorEnter(pCur);.
151c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
151d0 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50  Ref(pTempCur->pP
151e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
151f0 20 20 20 63 75 72 73 6f 72 4c 65 61 76 65 28 70     cursorLeave(p
15200 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
15210 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70  ** Delete a temp
15220 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63  orary cursor suc
15230 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79  h as was made by
15240 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f   the CreateTempo
15250 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20  raryCursor().** 
15260 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a  function above..
15270 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
15280 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
15290 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
152a0 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75  pCur){.  if( pCu
152b0 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20  r->pPage ){.    
152c0 63 75 72 73 6f 72 45 6e 74 65 72 28 70 43 75 72  cursorEnter(pCur
152d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
152e0 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70  gerUnref(pCur->p
152f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
15300 20 20 20 20 63 75 72 73 6f 72 4c 65 61 76 65 28      cursorLeave(
15310 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
15320 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15330 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
15340 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
15350 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
15360 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
15370 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
15380 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
15390 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73  valid, call.** s
153a0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
153b0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
153c0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
153d0 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
153e0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
153f0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
15400 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
15410 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
15420 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
15430 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
15440 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15450 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
15460 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
15470 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
15480 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
15490 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
154a0 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
154b0 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
154c0 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
154d0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
154e0 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
154f0 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
15500 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
15510 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
15520 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
15530 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
15540 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
15550 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
15560 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
15570 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
15580 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72  is not doing agr
15590 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
155a0 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
155b0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
155c0 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
155d0 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
155e0 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
155f0 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
15600 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
15610 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
15620 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
15630 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
15640 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
15650 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
15660 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
15670 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15680 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
15690 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
156a0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
156b0 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
156c0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
156d0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
156e0 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
156f0 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
15700 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
15710 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
15720 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
15730 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
15740 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
15750 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
15760 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
15770 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
15780 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
15790 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
157a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
157b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
157c0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
157d0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
157e0 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d  Cur->idx, &pCur-
157f0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  >info);.    }els
15800 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
15810 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
15820 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
15830 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
15840 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
15850 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
15860 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
15870 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
15880 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
15890 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
158a0 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
158e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
158f0 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42    \.    sqlite3B
15930 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
15940 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
15950 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66  >idx, &pCur->inf
15960 6f 29 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20  o);         \.  
15970 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
159c0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
159d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a00 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
15a10 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a  _MSC_VER */../*.
15a20 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
15a30 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
15a40 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
15a50 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
15a60 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
15a70 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
15a80 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
15a90 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
15aa0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
15ab0 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
15ac0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
15ad0 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
15ae0 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
15af0 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
15b00 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
15b10 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
15b20 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
15b30 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
15b40 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
15b50 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
15b60 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
15b70 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
15b80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 71 6c 69   int rc;..  sqli
15b90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 43  te3BtreeEnter(pC
15ba0 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72  ur->pBtree);.  r
15bb0 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
15bc0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
15bd0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
15be0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15bf0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
15c00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
15c10 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
15c20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
15c30 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
15c40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
15c50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
15c60 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
15c70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
15c80 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
15c90 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
15ca0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
15cb0 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
15cc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15cd0 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65  eave(pCur->pBtre
15ce0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
15cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
15d00 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
15d10 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
15d20 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
15d30 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
15d40 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
15d50 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
15d60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
15d70 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
15d80 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
15d90 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
15da0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
15db0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
15dc0 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
15dd0 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
15de0 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
15df0 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
15e00 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
15e10 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
15e20 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
15e30 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
15e40 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
15e50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 71  .  int rc;..  sq
15e60 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15e70 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20  pCur->pBtree);. 
15e80 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
15e90 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
15ea0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
15eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
15ed0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
15ee0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
15ef0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
15f00 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
15f10 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
15f20 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
15f30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
15f40 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
15f50 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
15f60 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
15f70 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
15f80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15f90 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
15fa0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
15fb0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
15fc0 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
15fd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15fe0 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65  eave(pCur->pBtre
15ff0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
16000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
16010 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16020 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
16030 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
16040 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
16050 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
16060 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
16070 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16080 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
16090 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
160a0 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
160b0 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
160c0 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
160d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
160e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
160f0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
16100 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
16110 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
16120 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
16130 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
16140 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16150 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
16160 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
16170 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f  .** Unless pPgno
16180 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
16190 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
161a0 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
161b0 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74  ow .** page in t
161c0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
161d0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  s written to *pP
161e0 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
161f0 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20   ovfl.** is the 
16200 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 27  last page in it'
16210 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a  s linked list, *
16220 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
16230 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
16240 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
16250 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20  t NULL, *ppPage 
16260 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65  is set to the Me
16270 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a  mPage* handle.**
16280 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20   for page ovfl. 
16290 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70  The underlying p
162a0 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68 61  ager page may ha
162b0 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
162c0 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f  d.** with the no
162d0 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74  Content flag set
162e0 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64 61  , so the page da
162f0 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76 69  ta accessable vi
16300 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65  a.** this handle
16310 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
16320 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
16330 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
16340 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
16350 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66  pBt, .  Pgno ovf
16360 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16370 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77       /* Overflow
16380 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   page */.  MemPa
16390 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
163a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
163b0 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a  MemPage handle *
163c0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
163d0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
163e0 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
163f0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
16400 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
16410 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  next = 0;.  int 
16420 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
16430 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
16440 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  Held(pBt->mutex)
16450 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20   );.  /* One of 
16460 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62  these must not b
16470 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  e NULL. Otherwis
16480 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73  e, why call this
16490 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20   function? */.  
164a0 61 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c  assert(ppPage ||
164b0 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20   pPgnoNext);..  
164c0 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20  /* If pPgnoNext 
164d0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
164e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
164f0 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f  eing called to o
16500 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d  btain.  ** a Mem
16510 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20  Page* reference 
16520 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61  only. No page-da
16530 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ta is required i
16540 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
16550 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65  /.  if( !pPgnoNe
16560 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  xt ){.    return
16570 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16580 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
16590 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a  ppPage, 1);.  }.
165a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
165b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
165c0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
165d0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
165e0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
165f0 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
16600 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
16610 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
16620 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
16630 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
16640 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
16650 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
16660 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
16670 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
16680 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
16690 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
166a0 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
166b0 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
166c0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
166d0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
166e0 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
166f0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
16700 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
16710 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
16720 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
16730 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
16740 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
16750 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
16760 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
16770 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
16780 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16790 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
167a0 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
167b0 69 66 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69  if( iGuess<=sqli
167c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
167d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
167e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
167f0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
16800 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
16810 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
16820 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16850 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
16860 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
16870 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
16880 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
16890 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ss;.      }.    
168a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
168b0 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70  if( next==0 || p
168c0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d  pPage ){.    Mem
168d0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
168e0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
168f0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
16900 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
16910 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20  , next!=0);.    
16920 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
16930 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
16940 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d  );.    if( next=
16950 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
16960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
16970 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
16980 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
16990 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61 67  }..    if( ppPag
169a0 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  e ){.      *ppPa
169b0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20  ge = pPage;.    
169c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c  }else{.      rel
169d0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
169e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50  .    }.  }.  *pP
169f0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
16a00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16a10 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
16a20 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
16a30 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
16a40 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
16a50 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
16a60 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
16a70 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
16a80 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
16a90 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
16aa0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
16ab0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
16ac0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
16ad0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
16ae0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
16af0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
16b00 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
16b10 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
16b20 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
16b30 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
16b40 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
16b50 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
16b60 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
16b70 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
16b80 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
16b90 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
16ba0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16bb0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
16bc0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
16bd0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
16be0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
16bf0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
16c00 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
16c10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
16c20 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
16c30 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
16c40 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
16c50 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
16c60 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
16c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16c80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
16c90 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
16ca0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
16cb0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
16cc0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
16cd0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
16ce0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
16cf0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
16d00 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
16d10 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
16d20 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
16d30 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
16d40 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
16d50 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
16d60 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
16d70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16d80 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
16d90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16dc0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
16dd0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
16de0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
16df0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
16e00 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
16e10 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
16e20 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
16e30 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
16e40 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
16e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16e60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
16e70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
16e80 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
16e90 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
16ea0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
16eb0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
16ec0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
16ed0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
16ee0 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
16ef0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
16f00 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
16f10 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
16f20 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
16f30 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
16f40 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
16f50 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
16f60 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
16f70 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
16f80 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
16f90 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
16fa0 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
16fb0 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
16fc0 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
16fd0 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
16fe0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
16ff0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17000 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
17010 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
17020 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
17030 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
17040 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62 79  ads or writes by
17050 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79  tes from the pay
17060 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61  load area.  Data
17070 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61   might .** appea
17080 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
17090 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ge or be scatter
170a0 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
170b0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  le overflow .** 
170c0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
170d0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
170e0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
170f0 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
17100 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
17110 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
17120 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
17130 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
17140 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
17150 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
17160 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
17170 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
17180 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
17190 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
171a0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
171b0 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
171c0 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
171d0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
171e0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
171f0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
17200 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
17210 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
17220 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
17230 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
17240 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
17250 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
17260 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
17270 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
17280 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
17290 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
172a0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
172b0 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
172c0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
172d0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
172e0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
172f0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
17300 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
17310 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
17320 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
17330 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
17340 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
17350 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
17360 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
17370 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
17380 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
17390 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
173a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
173b0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
173c0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
173d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
173e0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
173f0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
17400 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
17410 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
17420 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
17430 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
17440 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
17450 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  d */.  int amt, 
17460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17470 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
17480 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
17490 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
174a0 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
174b0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
174c0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70  r */ .  int skip
174d0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Key,         /* 
174e0 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74  offset begins at
174f0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
17500 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65   true */.  int e
17510 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
17520 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e  /* zero to read.
17530 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69   non-zero to wri
17540 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  te. */.){.  unsi
17550 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
17560 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oad;.  int rc = 
17570 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32  SQLITE_OK;.  u32
17580 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64   nKey;.  int iId
17590 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
175a0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
175b0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a  pPage;        /*
175c0 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
175d0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
175e0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
175f0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
17600 42 74 72 65 65 2d 3e 70 42 74 3b 20 20 20 2f 2a  Btree->pBt;   /*
17610 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
17620 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
17630 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
17640 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
17650 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17660 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
17670 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
17680 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
17690 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
176a0 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
176b0 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
176c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
176d0 74 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42  texHeld(pCur->pB
176e0 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  tree->pBt->mutex
176f0 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
17700 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
17710 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
17720 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
17730 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
17740 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
17750 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75  intKey ? 0 : pCu
17760 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a  r->info.nKey);..
17770 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
17780 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e  .    offset += n
17790 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  Key;.  }.  if( o
177a0 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
177b0 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
177c0 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  a ){.    /* Tryi
177d0 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
177e0 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
177f0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
17800 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
17810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
17820 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ROR;.  }..  /* C
17830 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
17840 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
17850 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
17860 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
17870 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
17880 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
17890 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
178a0 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
178b0 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
178c0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
178d0 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
178e0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
178f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
17900 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
17910 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
17920 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
17930 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
17940 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
17950 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
17960 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
17970 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
17980 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
17990 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
179a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
179b0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
179c0 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69  const int ovflSi
179d0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
179e0 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
179f0 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
17a00 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
17a10 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
17a20 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
17a30 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
17a40 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
17a50 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66  ocal]);..#ifndef
17a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
17a70 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20  RBLOB.    /* If 
17a80 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  the isIncrblobHa
17a90 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
17aa0 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f   and the BtCurso
17ab0 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20  r.aOverflow[].  
17ac0 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
17ad0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
17ae0 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ocate it now. Th
17af0 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  e array is sized
17b00 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65   at.    ** one e
17b10 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
17b20 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
17b30 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
17b40 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61  n. The.    ** pa
17b50 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
17b60 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
17b70 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
17b80 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a  n aOverflow[0],.
17b90 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61      ** etc. A va
17ba0 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
17bb0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
17bc0 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  y means "not yet
17bd0 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28   known".    ** (
17be0 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
17bf0 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
17c00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
17c10 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
17c20 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e  andle && !pCur->
17c30 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
17c40 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
17c50 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
17c60 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
17c70 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
17c80 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
17c90 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
17ca0 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69  w = (Pgno *)sqli
17cb0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
17cc0 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c  zeof(Pgno)*nOvfl
17cd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  );.      if( nOv
17ce0 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  fl && !pCur->aOv
17cf0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
17d00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17d10 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
17d20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17d30 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
17d40 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
17d50 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
17d60 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
17d70 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
17d80 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
17d90 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
17da0 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
17db0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
17dc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
17dd0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
17de0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
17df0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
17e00 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
17e10 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
17e20 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
17e30 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
17e40 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
17e50 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
17e60 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
17e70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
17e80 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
17e90 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
17ea0 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
17eb0 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  +){..#ifndef SQL
17ec0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
17ed0 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  B.      /* If re
17ee0 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
17ef0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
17f00 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
17f10 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
17f20 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
17f30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
17f40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
17f50 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
17f60 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
17f70 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
17f80 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
17f90 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
17fa0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ge;.      }.#end
17fb0 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  if..      if( of
17fc0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
17fd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
17fe0 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
17ff0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
18000 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
18010 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
18020 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
18030 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
18040 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
18050 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
18060 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
18070 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
18080 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
18090 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
180a0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
180b0 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
180c0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
180d0 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
180e0 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
180f0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
18100 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65         */.#ifnde
18110 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
18120 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69  CRBLOB.        i
18130 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
18140 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
18150 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
18160 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
18170 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
18180 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
18190 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23         } else .#
181a0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
181b0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
181c0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
181d0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
181e0 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
181f0 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
18200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18210 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
18220 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
18230 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
18240 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
18250 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
18260 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
18270 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
18280 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
18290 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
182a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50    */.        DbP
182b0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
182c0 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
182d0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
182e0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
182f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
18300 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29  tPage, &pDbPage)
18310 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18330 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
18340 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
18350 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
18360 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
18370 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
18380 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
18390 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
183a0 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
183b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20  {.            a 
183c0 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
183d0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  set;.          }
183e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
183f0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
18400 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
18410 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
18420 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
18430 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
18440 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
18450 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
18460 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
18470 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
18480 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
18490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
184a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
184b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
184c0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
184d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
184e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
184f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18500 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
18510 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
18520 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
18530 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
18540 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
18550 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
18560 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
18570 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
18580 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
18590 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
185a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
185b0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
185c0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
185d0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
185e0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
185f0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
18600 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
18610 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
18620 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
18630 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18640 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
18650 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
18660 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
18670 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
18680 72 63 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  rc;..  sqlite3Bt
18690 72 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70  reeEnter(pCur->p
186a0 42 74 72 65 65 29 3b 0a 20 20 72 63 20 3d 20 72  Btree);.  rc = r
186b0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
186c0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
186d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
186e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
186f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18700 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18710 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18720 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
18730 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
18740 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
18750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
18760 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70  reeLeave(pCur->p
18770 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  Btree);.      re
18780 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18790 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
187a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
187b0 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ->pPage->intKey=
187c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
187d0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
187e0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
187f0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
18800 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
18810 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
18820 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
18830 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
18840 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
18850 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18860 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a  (pCur->pBtree);.
18870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18880 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
18890 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
188a0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
188b0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
188c0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
188d0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
188e0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
188f0 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
18900 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
18910 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
18920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
18930 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
18940 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
18950 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
18960 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
18970 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
18980 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
18990 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
189a0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
189b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
189c0 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
189d0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
189e0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
189f0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
18a00 6e 74 20 72 63 3b 0a 0a 20 20 73 71 6c 69 74 65  nt rc;..  sqlite
18a10 33 42 74 72 65 65 45 6e 74 65 72 28 70 43 75 72  3BtreeEnter(pCur
18a20 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 63 20  ->pBtree);.  rc 
18a30 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18a40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18a50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18a70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18a80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18a90 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18aa0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18ab0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18ac0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
18ad0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
18ae0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
18af0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
18b00 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
18b10 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
18b20 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71   1, 0);.  }.  sq
18b30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18b40 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20  pCur->pBtree);. 
18b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18b60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
18b70 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
18b80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
18b90 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
18ba0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
18bb0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
18bc0 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
18bd0 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
18be0 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
18bf0 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
18c00 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
18c10 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
18c20 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
18c30 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
18c40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18c50 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
18c60 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
18c70 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
18c80 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
18c90 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
18ca0 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
18cb0 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
18cc0 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
18cd0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
18ce0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
18cf0 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
18d00 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
18d10 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
18d20 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
18d30 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
18d40 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
18d50 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
18d60 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
18d70 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
18d80 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
18d90 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
18da0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
18db0 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
18dc0 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
18dd0 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
18de0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
18df0 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
18e00 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
18e10 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
18e20 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  bly.** the key/d
18e30 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
18e40 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
18e50 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
18e60 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
18e70 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
18e80 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
18e90 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
18ea0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
18eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
18ec0 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
18ed0 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
18ee0 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
18ef0 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
18f00 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
18f10 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
18f20 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68  gned char *fetch
18f30 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
18f40 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
18f50 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
18f60 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
18f70 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
18f80 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20  t *pAmt,        
18f90 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18fa0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
18fb0 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
18fc0 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20  /.  int skipKey 
18fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64           /* read
18fe0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61   beginning at da
18ff0 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
19000 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
19010 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
19020 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad;.  MemPage *p
19030 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Page;.  u32 nKey
19040 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a  ;.  int nLocal;.
19050 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
19060 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67  =0 && pCur->pPag
19070 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
19080 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19090 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
190a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
190b0 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
190c0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
190d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
190e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
190f0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ge;.  assert( pC
19100 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
19110 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
19120 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
19130 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
19140 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
19150 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
19160 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
19170 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
19180 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
19190 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
191a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
191b0 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  nKey = pCur->inf
191c0 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
191d0 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
191e0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
191f0 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
19200 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19210 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
19220 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
19230 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19240 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61  l;.    if( nLoca
19250 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  l>nKey ){.      
19260 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20  nLocal = nKey;. 
19270 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74     }.  }.  *pAmt
19280 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
19290 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
192a0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
192b0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
192c0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
192d0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
192e0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
192f0 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
19300 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
19310 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
19320 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
19330 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
19340 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
19350 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
19360 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
19370 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
19380 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
19390 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
193a0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
193b0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
193c0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
193d0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
193e0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
193f0 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
19400 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
19410 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
19420 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
19430 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
19440 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
19450 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
19460 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
19470 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
19480 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
19490 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
194a0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
194b0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
194c0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
194d0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
194e0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
194f0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
19500 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
19510 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
19520 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
19530 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c  te3BtreeMutexHel
19540 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
19550 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19560 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
19570 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
19590 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
195a0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
195b0 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
195c0 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20  turn 0;.}.const 
195d0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
195e0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
195f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
19600 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
19610 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
19620 74 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42  texHeld(pCur->pB
19630 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  tree->pBt->mutex
19640 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
19650 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19660 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
19670 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
19680 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
19690 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
196a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
196b0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
196c0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
196d0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
196e0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
196f0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
19700 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
19710 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
19720 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
19730 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19740 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
19750 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
19760 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
19770 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
19780 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  e;.  MemPage *pO
19790 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ldPage;.  BtShar
197a0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
197b0 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20  pBtree->pBt;..  
197c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
197d0 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42  treeMutexHeld(pB
197e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
197f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19800 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19810 44 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41  D );.  rc = getA
19820 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
19830 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
19840 67 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29  ge, pCur->pPage)
19850 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
19860 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61  urn rc;.  pNewPa
19870 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  ge->idxParent = 
19880 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c  pCur->idx;.  pOl
19890 64 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  dPage = pCur->pP
198a0 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d  age;.  pOldPage-
198b0 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20  >idxShift = 0;. 
198c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c   releasePage(pOl
198d0 64 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  dPage);.  pCur->
198e0 70 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65  pPage = pNewPage
198f0 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  ;.  pCur->idx = 
19900 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
19910 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
19920 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
19930 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <1 ){.    return
19940 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
19950 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
19960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19970 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
19980 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
19990 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  s the virtual ro
199a0 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e  ot of its table.
199b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75  .**.** The virtu
199c0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
199d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f  the root page fo
199e0 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20  r most tables.  
199f0 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74  But.** for the t
19a00 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70  able rooted on p
19a10 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20  age 1, sometime 
19a20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61  the real root pa
19a30 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65  ge.** is empty e
19a40 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69  xcept for the ri
19a50 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e  ght-pointer.  In
19a60 20 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a   such cases the.
19a70 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
19a80 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
19a90 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
19aa0 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a  pointer of page.
19ab0 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67  ** 1 is pointing
19ac0 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   to..*/.int sqli
19ad0 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
19ae0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
19af0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
19b00 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72  Parent;..  asser
19b10 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
19b20 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e  utexHeld(pPage->
19b30 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19b40 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65   pParent = pPage
19b50 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66 28  ->pParent;.  if(
19b60 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72 65   pParent==0 ) re
19b70 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50  turn 1;.  if( pP
19b80 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20  arent->pgno>1 ) 
19b90 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19ba0 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65 6e  get2byte(&pParen
19bb0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
19bc0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
19bd0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19be0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
19bf0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19c00 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
19c10 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
19c20 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
19c30 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
19c40 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
19c50 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
19c60 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
19c70 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
19c80 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
19c90 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
19ca0 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
19cb0 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
19cc0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
19cd0 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
19ce0 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
19cf0 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
19d00 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
19d10 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
19d20 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
19d30 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 4d  ge *pParent;.  M
19d40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
19d50 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b 0a   int idxParent;.
19d60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19d70 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65  nter(pCur->pBtre
19d80 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e);.  assert( pC
19d90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19da0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50  OR_VALID );.  pP
19db0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
19dc0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
19dd0 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
19de0 74 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  t( !sqlite3Btree
19df0 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  IsRootPage(pPage
19e00 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d  ) );.  pParent =
19e10 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
19e20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
19e30 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78 50 61  nt!=0 );.  idxPa
19e40 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69 64  rent = pPage->id
19e50 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  xParent;.  sqlit
19e60 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
19e70 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
19e80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19e90 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  e);.  pCur->pPag
19ea0 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 70  e = pParent;.  p
19eb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
19ec0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
19ed0 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74  Parent->idxShift
19ee0 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ==0 );.  pCur->i
19ef0 64 78 20 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a  dx = idxParent;.
19f00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19f10 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ave(pCur->pBtree
19f20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
19f30 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
19f40 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a  he root page.*/.
19f50 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
19f60 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
19f70 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
19f80 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
19f90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19fa0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
19fb0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
19fc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19fd0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Bt;..  assert( s
19fe0 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
19ff0 48 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d  Held(p->pSqlite-
1a000 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1a010 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1a020 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d 3e  eMutexHeld(pBt->
1a030 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
1a040 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a050 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1a060 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72   ){.    clearCur
1a070 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1a080 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  );.  }.  pRoot =
1a090 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1a0a0 69 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52 6f  if( pRoot && pRo
1a0b0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
1a0c0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
1a0d0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
1a0e0 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65  sInit );.  }else
1a0f0 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
1a100 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
1a110 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
1a120 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
1a130 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
1a140 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
1a150 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1a160 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1a170 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a180 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
1a190 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
1a1a0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  );.    pCur->pPa
1a1b0 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a  ge = pRoot;.  }.
1a1c0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
1a1d0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1a1e0 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
1a1f0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
1a200 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
1a210 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
1a220 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge;.    assert( 
1a230 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pRoot->pgno==1 )
1a240 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
1a250 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
1a260 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
1a270 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1a280 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65   assert( subpage
1a290 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 );.    pCur->
1a2a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1a2b0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
1a2c0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1a2d0 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a  , subpage);.  }.
1a2e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1a2f0 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   ((pCur->pPage->
1a300 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
1a310 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
1a320 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20  ALID);.  return 
1a330 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1a340 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1a350 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
1a360 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1a370 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
1a380 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
1a390 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1a3a0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
1a3b0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
1a3c0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1a3d0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
1a3e0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
1a3f0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1a400 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a410 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1a420 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1a430 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1a440 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a450 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1a460 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1a470 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
1a480 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  exHeld(pCur->pBt
1a490 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  ree->pBt->mutex)
1a4a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1a4b0 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
1a4c0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1a4d0 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
1a4e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a4f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a500 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1a510 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1a520 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1a530 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
1a540 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
1a550 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1a560 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
1a570 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1a580 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1a590 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1a5a0 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20   pCur->idx));.  
1a5b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a5c0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a5d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a5e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1a5f0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1a600 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1a610 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1a620 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
1a630 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1a640 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1a650 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
1a660 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
1a670 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
1a680 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
1a690 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
1a6a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
1a6b0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
1a6c0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1a6d0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
1a6e0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
1a6f0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
1a700 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
1a710 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1a720 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
1a730 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1a740 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
1a750 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1a760 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
1a770 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
1a780 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1a790 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a7a0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
1a7b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1a7c0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1a7d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a7e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1a7f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1a800 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c  te3BtreeMutexHel
1a810 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1a820 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1a830 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a840 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
1a850 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71  Cur->pBtree->pSq
1a860 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  lite->mutex) );.
1a870 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a880 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a890 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
1a8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1a8b0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
1a8c0 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
1a8d0 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
1a8e0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1a8f0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1a900 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
1a910 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d  ur->idx = pPage-
1a920 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d  >nCell;.    rc =
1a930 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1a940 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
1a950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a960 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  K ){.    pCur->i
1a970 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  dx = pPage->nCel
1a980 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 75 72 2d  l - 1;.    pCur-
1a990 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1a9a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1a9b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
1a9c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1a9d0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1a9e0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1a9f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1aa00 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1aa10 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1aa20 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1aa30 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1aa40 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1aa50 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1aa60 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1aa70 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1aa80 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
1aa90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1aaa0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1aab0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1aac0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
1aad0 74 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42  texHeld(pCur->pB
1aae0 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  tree->pBt->mutex
1aaf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1ab00 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
1ab10 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  Held(pCur->pBtre
1ab20 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65  e->pSqlite->mute
1ab30 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
1ab40 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1ab50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ab60 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
1ab70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ab80 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1ab90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1aba0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1abb0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1abc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
1abd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1abe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1abf0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1ac00 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
1ac10 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1ac20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1ac30 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1ac40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ac50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1ac60 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1ac70 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1ac80 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1ac90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1aca0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
1acb0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
1acc0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
1acd0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
1ace0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
1acf0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
1ad00 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1ad10 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1ad20 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
1ad30 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1ad40 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1ad50 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  ;. .  assert( sq
1ad60 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
1ad70 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1ad80 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1ad90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ada0 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
1adb0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
1adc0 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29  Sqlite->mutex) )
1add0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1ade0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1adf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ae00 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
1ae10 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1ae20 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
1ae30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1ae40 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1ae50 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1ae60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ae70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ae80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ae90 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
1aea0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1aeb0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
1aec0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1aed0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1aee0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1aef0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
1af00 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
1af10 20 65 6e 74 72 79 20 6e 65 61 72 20 70 4b 65 79   entry near pKey
1af20 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e  /nKey..** Return
1af30 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
1af40 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
1af50 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74  Y tables, only t
1af60 68 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74 65  he nKey paramete
1af70 72 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  r is used.  pKey
1af80 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
1af90 20 46 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65   For other table
1afa0 73 2c 20 6e 4b 65 79 20 69 73 20 74 68 65 20 6e  s, nKey is the n
1afb0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1afc0 66 20 64 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65  f data.** in pKe
1afd0 79 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73  y.  The comparis
1afe0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63  on function spec
1aff0 69 66 69 65 64 20 77 68 65 6e 20 74 68 65 20 63  ified when the c
1b000 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65  ursor was.** cre
1b010 61 74 65 64 20 69 73 20 75 73 65 64 20 74 6f 20  ated is used to 
1b020 63 6f 6d 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a  compare keys..**
1b030 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
1b040 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
1b050 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
1b060 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
1b070 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1b080 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
1b090 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
1b0a0 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
1b0b0 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
1b0c0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
1b0d0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
1b0e0 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
1b0f0 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
1b100 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
1b110 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   The result of c
1b120 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
1b130 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
1b140 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20  to which the.** 
1b150 63 75 72 73 6f 72 20 69 73 20 77 72 69 74 74 65  cursor is writte
1b160 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52  n to *pRes if pR
1b170 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d  es!=NULL.  The m
1b180 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69  eaning of.** thi
1b190 73 20 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f  s value is as fo
1b1a0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
1b1b0 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
1b1c0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1b1d0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1b1e0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b200 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
1b210 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
1b220 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b240 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
1b250 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
1b260 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
1b270 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
1b280 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
1b290 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1b2a0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1b2b0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
1b2d0 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79  tly matches pKey
1b2e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
1b2f0 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
1b300 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1b310 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1b320 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1b330 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
1b340 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a  ger than pKey..*
1b350 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
1b360 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42  BtreeMoveto(.  B
1b370 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1b380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1b390 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
1b3a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1b3b0 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1b3c0 68 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66  he key content f
1b3d0 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  or indices.  Not
1b3e0 20 75 73 65 64 20 62 79 20 74 61 62 6c 65 73 20   used by tables 
1b3f0 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
1b400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b410 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72  ize of pKey.  Or
1b420 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62   the key for tab
1b430 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  les */.  int bia
1b440 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
1b450 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
1b460 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
1b470 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
1b480 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
1b490 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
1b4a0 68 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f  h result flag */
1b4b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
1b4c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b4d0 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
1b4e0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
1b4f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1b500 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1b510 65 65 4d 75 74 65 78 48 65 6c 64 28 70 43 75 72  eeMutexHeld(pCur
1b520 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  ->pBtree->pSqlit
1b530 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  e->mutex) );.  r
1b540 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b550 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1b560 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1b570 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b580 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
1b590 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b5a0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1b5b0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b5c0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1b5d0 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
1b5e0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
1b5f0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1b600 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
1b610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b620 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20    }.  for(;;){. 
1b630 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1b640 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1b650 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1b660 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1b670 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1b680 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1b690 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1b6a0 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1b6b0 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1b6c0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1b6d0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1b6e0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1b6f0 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  y && pKey==0 ){.
1b700 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b710 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b730 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
1b740 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75     pCur->idx = u
1b750 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
1b760 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1b770 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20   (upr+lwr)/2;.  
1b780 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c    }.    if( lwr<
1b790 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a  =upr ) for(;;){.
1b7a0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
1b7b0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20  lKey;.      i64 
1b7c0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1b7d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b7e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1b7f0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1b800 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65  .        u8 *pCe
1b810 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ll;.        pCel
1b820 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1b830 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b  ge, pCur->idx) +
1b840 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
1b850 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1b860 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1b870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
1b880 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
1b890 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
1b8a0 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26  arint32(pCell, &
1b8b0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1b8c0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1b8d0 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20  int(pCell, (u64 
1b8e0 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
1b8f0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
1b900 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey<nKey ){.     
1b910 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
1b920 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1b930 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a  CellKey>nKey ){.
1b940 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
1b950 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1b960 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
1b970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b990 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a   int available;.
1b9a0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1b9b0 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68   = (void *)fetch
1b9c0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61  Payload(pCur, &a
1b9d0 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20  vailable, 0);.  
1b9e0 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d        nCellKey =
1b9f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1ba00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76  ;.        if( av
1ba10 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65  ailable>=nCellKe
1ba20 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1ba30 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
1ba40 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
1ba50 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1ba60 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
1ba70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ba80 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1ba90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1baa0 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  c( nCellKey );. 
1bab0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1bac0 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  llKey==0 ) retur
1bad0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1bae0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1baf0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1bb00 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
1bb10 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b  , (void *)pCellK
1bb20 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ey);.          c
1bb30 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
1bb40 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
1bb50 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1bb60 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
1bb70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1bb80 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
1bb90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1bba0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1bbb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1bbc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bbd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1bbe0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
1bbf0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1bc00 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67  eafData && !pPag
1bc10 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1bc20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1bc30 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  >idx;.          
1bc40 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
1bc50 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1bc60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1bc70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
1bc80 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  s ) *pRes = 0;. 
1bc90 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1bca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1bcb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bcc0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
1bcd0 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72        lwr = pCur
1bce0 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  ->idx+1;.      }
1bcf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
1bd00 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b  r = pCur->idx-1;
1bd10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bd20 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20  f( lwr>upr ){.  
1bd30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bd40 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
1bd50 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29  >idx = (lwr+upr)
1bd60 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  /2;.    }.    as
1bd70 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
1bd80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bd90 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1bda0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1bdb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68  leaf ){.      ch
1bdc0 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ldPg = 0;.    }e
1bdd0 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61  lse if( lwr>=pPa
1bde0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1bdf0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
1be00 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1be10 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1be20 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
1be30 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
1be40 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
1be50 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
1be60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1be70 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20   chldPg==0 ){.  
1be80 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1be90 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
1bea0 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
1beb0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1bec0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
1bed0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 65  es = c;.      re
1bee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bef0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1bf00 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70  idx = lwr;.    p
1bf10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1bf20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
1bf30 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1bf40 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
1bf50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
1bf60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1bf70 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48  }.  /* NOT REACH
1bf80 45 44 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ED */.}.../*.** 
1bf90 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1bfa0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1bfb0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1bfc0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
1bfd0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
1bfe0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1bff0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1c000 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1c010 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
1c020 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1c030 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
1c040 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1c050 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
1c060 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1c070 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
1c080 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1c090 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1c0a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c0b0 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
1c0c0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
1c0d0 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
1c0e0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
1c0f0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
1c100 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
1c110 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
1c120 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
1c130 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
1c140 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
1c150 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1c160 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
1c170 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
1c180 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
1c190 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
1c1a0 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
1c1b0 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1c1c0 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1c1d0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c1e0 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72  handle for a cur
1c1f0 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  sor..*/.sqlite3 
1c200 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72  *sqlite3BtreeCur
1c210 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75  sorDb(const BtCu
1c220 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1c230 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72  eturn pCur->pBtr
1c240 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 7d 0a 0a  ee->pSqlite;.}..
1c250 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
1c260 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1c270 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
1c280 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1c290 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1c2a0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1c2b0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1c2c0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1c2d0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
1c2e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1c2f0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
1c300 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1c310 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
1c320 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
1c330 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1c340 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
1c350 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1c360 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
1c370 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1c380 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1c390 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1c3a0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1c3b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c3c0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c3d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
1c3e0 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  es!=0 );.  pPage
1c3f0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1c400 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1c410 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1c420 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
1c430 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1c440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c450 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
1c460 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
1c470 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
1c480 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1c490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c4a0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
1c4b0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1c4c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1c4d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c4e0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
1c4f0 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78   );..  pCur->idx
1c500 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ++;.  pCur->info
1c510 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
1c520 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1c530 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1c540 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1c550 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1c560 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1c570 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
1c580 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1c590 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
1c5a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1c5b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1c5c0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1c5d0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
1c5e0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1c5f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c600 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
1c610 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1c620 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1c630 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  e) ){.        *p
1c640 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1c650 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1c660 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1c670 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1c680 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c690 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1c6a0 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1c6b0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1c6c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1c6d0 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
1c6e0 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1c6f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
1c700 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
1c710 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1c720 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c730 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1c740 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1c750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1c760 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c770 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1c780 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1c790 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1c7a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1c7b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c7c0 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1c7d0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1c7e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
1c7f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1c800 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
1c810 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1c820 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 75 72 73    int rc;.  curs
1c830 6f 72 45 6e 74 65 72 28 70 43 75 72 29 3b 0a 20  orEnter(pCur);. 
1c840 20 72 63 20 3d 20 62 74 72 65 65 4e 65 78 74 28   rc = btreeNext(
1c850 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 63  pCur, pRes);.  c
1c860 75 72 73 6f 72 4c 65 61 76 65 28 70 43 75 72 29  ursorLeave(pCur)
1c870 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c880 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
1c890 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1c8a0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
1c8b0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
1c8c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1c8d0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1c8e0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1c8f0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1c900 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1c910 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
1c920 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1c930 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1c940 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c950 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1c960 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1c970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
1c980 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1c990 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1c9a0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1c9b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1c9c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1c9d0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1c9e0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1c9f0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1ca00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ca10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1ca20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53  ;.  }.  if( CURS
1ca30 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1ca40 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1ca50 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1ca60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ca70 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1ca80 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
1ca90 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1caa0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1cab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cac0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1cad0 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
1cae0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1caf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1cb00 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1cb10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1cb20 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
1cb30 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1cb40 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1cb50 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  ( findCell(pPage
1cb60 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a  , pCur->idx) );.
1cb70 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1cb80 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1cb90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1cba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cbb0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1cbc0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1cbd0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
1cbe0 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
1cbf0 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >idx==0 ){.     
1cc00 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1cc10 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1cc20 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  e) ){.        pC
1cc30 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1cc40 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1cc50 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1cc60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1cc70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1cc80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1cc90 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1cca0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1ccb0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1ccc0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  e;.    }.    pCu
1ccd0 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43  r->idx--;.    pC
1cce0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1ccf0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1cd00 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21  e->leafData && !
1cd10 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1cd20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1cd30 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
1cd40 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
1cd50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1cd60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1cd70 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
1cd80 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1cd90 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
1cda0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
1cdb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1cdc0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1cdd0 3b 0a 20 20 63 75 72 73 6f 72 45 6e 74 65 72 28  ;.  cursorEnter(
1cde0 70 43 75 72 29 3b 0a 20 20 72 63 20 3d 20 62 74  pCur);.  rc = bt
1cdf0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
1ce00 2c 20 70 52 65 73 29 3b 0a 20 20 63 75 72 73 6f  , pRes);.  curso
1ce10 72 4c 65 61 76 65 28 70 43 75 72 29 3b 0a 20 20  rLeave(pCur);.  
1ce20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ce30 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
1ce40 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
1ce50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ce60 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
1ce70 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
1ce80 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
1ce90 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
1cea0 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
1ceb0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1cec0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
1ced0 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
1cee0 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
1cef0 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
1cf00 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
1cf10 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
1cf20 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1cf30 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
1cf40 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
1cf50 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
1cf60 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
1cf70 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1cf80 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1cf90 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
1cfa0 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
1cfb0 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
1cfc0 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
1cfd0 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
1cfe0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
1cff0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
1d000 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
1d010 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
1d020 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
1d030 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
1d040 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1d050 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
1d060 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1d070 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65  t 0, then a (fee
1d080 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d  ble) effort is m
1d090 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
1d0a0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
1d0b0 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
1d0c0 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
1d0d0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
1d0e0 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
1d0f0 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
1d100 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
1d110 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
1d120 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
1d130 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
1d140 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
1d150 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
1d160 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65  .**.** If the "e
1d170 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20  xact" parameter 
1d180 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68  is not 0, and th
1d190 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65  e page-number ne
1d1a0 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20  arby exists .** 
1d1b0 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
1d1c0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
1d1d0 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  it is guarenteed
1d1e0 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
1d1f0 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1d200 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
1d210 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77  cuum databases w
1d220 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  hen allocating a
1d230 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   new table..*/.s
1d240 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1d250 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
1d260 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
1d270 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
1d280 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e  e, .  Pgno *pPgn
1d290 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62  o, .  Pgno nearb
1d2a0 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b  y,.  u8 exact.){
1d2b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d2c0 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
1d2d0 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  int n;     /* Nu
1d2e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
1d2f0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1d300 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a  .  int k;     /*
1d310 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
1d320 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
1d330 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
1d340 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
1d350 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
1d360 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
1d370 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
1d380 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
1d390 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  Held(pBt->mutex)
1d3a0 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
1d3b0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20  Bt->pPage1;.  n 
1d3c0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1d3d0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1d3e0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1d3f0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
1d400 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1d410 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
1d420 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
1d430 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
1d440 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
1d450 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
1d460 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
1d470 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
1d480 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
1d490 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
1d4a0 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
1d4b0 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
1d4c0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
1d4d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
1d4e0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
1d4f0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1d500 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
1d510 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1d520 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
1d530 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
1d540 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1d550 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
1d560 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1d570 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1d580 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
1d590 26 26 20 6e 65 61 72 62 79 3c 3d 73 71 6c 69 74  && nearby<=sqlit
1d5a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1d5b0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
1d5c0 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
1d5d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1d5e0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
1d5f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
1d600 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
1d610 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1d620 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
1d630 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
1d640 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1d650 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
1d660 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1d670 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
1d680 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
1d690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1d6a0 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
1d6b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1d6c0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1d6d0 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
1d6e0 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
1d6f0 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
1d700 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
1d710 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
1d720 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
1d730 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
1d740 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
1d750 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d760 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1d770 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1d780 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1d790 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
1d7a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1d7b0 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
1d7c0 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
1d7d0 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
1d7e0 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
1d7f0 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
1d800 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
1d810 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
1d820 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
1d830 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
1d840 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
1d850 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
1d860 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
1d870 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
1d880 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1d890 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
1d8a0 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
1d8b0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
1d8c0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
1d8d0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1d8e0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1d8f0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
1d900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
1d910 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1d920 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d930 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
1d940 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1d950 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1d960 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
1d970 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1d980 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
1d990 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
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 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  }..      k = get
1d9d0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1d9e0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
1d9f0 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
1da00 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
1da10 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1da20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
1da30 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
1da40 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
1da50 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
1da60 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
1da70 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
1da80 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
1da90 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
1daa0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
1dab0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
1dac0 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
1dad0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
1dae0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1daf0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1db00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1db10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1db20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1db30 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1db40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
1db50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
1db60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1db70 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1db80 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1db90 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1dba0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
1dbb0 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
1dbc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1dbd0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1dbe0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1dbf0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1dc00 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1dc10 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1dc20 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   k>pBt->usableSi
1dc30 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
1dc40 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
1dc50 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  k is out of rang
1dc60 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  e.  Database cor
1dc70 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1dc80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1dc90 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1dca0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1dcb0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
1dcc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dcd0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1dce0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
1dcf0 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79  chList && nearby
1dd00 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  ==iTrunk ){.    
1dd10 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
1dd20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
1dd30 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
1dd40 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
1dd50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
1dd60 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
1dd70 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
1dd80 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
1dd90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dda0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1ddb0 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20  ==iTrunk );.    
1ddc0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
1ddd0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
1dde0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
1ddf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1de00 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
1de10 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1de20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1de30 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1de40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1de50 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1de60 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
1de70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1de80 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1de90 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1dea0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1deb0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
1dec0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1ded0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dee0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1def0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1df00 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
1df10 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1df20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1df30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1df40 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1df50 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
1df60 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
1df70 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
1df80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
1df90 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
1dfa0 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
1dfb0 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
1dfc0 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
1dfd0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
1dfe0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
1dff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1e000 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
1e010 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
1e020 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
1e030 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1e040 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
1e050 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e060 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
1e070 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
1e080 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
1e090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e0a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e0b0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1e0c0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1e0d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1e0e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1e0f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e100 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
1e110 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
1e120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e140 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1e150 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1e160 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1e170 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1e180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e190 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1e1a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
1e1b0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1e1c0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1e1d0 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
1e1e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
1e1f0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
1e200 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
1e210 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
1e220 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
1e230 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
1e240 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e250 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
1e260 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
1e270 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1e280 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e290 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1e2a0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
1e2b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e2c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1e2d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e2e0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
1e2f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e300 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e310 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1e320 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1e330 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
1e340 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
1e350 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
1e360 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
1e370 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1e380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1e390 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1e3a0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
1e3b0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1e3c0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
1e3d0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
1e3e0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
1e3f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1e400 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  e{.        /* Ex
1e410 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
1e420 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
1e430 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65         int close
1e440 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
1e450 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1e460 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1e470 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
1e480 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
1e490 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e4a0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1e4b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1e4c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1e4d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1e4e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1e4f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1e500 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
1e510 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69         int i, di
1e520 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
1e530 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
1e540 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
1e550 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
1e560 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
1e570 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
1e580 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
1e590 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
1e5a0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
1e5b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
1e5c0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1e5d0 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
1e5e0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
1e5f0 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
1e600 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
1e610 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
1e630 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
1e640 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
1e650 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
1e660 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e680 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1e690 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
1e6a0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
1e6b0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1e6c0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
1e6d0 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
1e6e0 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
1e6f0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
1e700 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
1e710 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
1e720 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65 33  ( *pPgno>sqlite3
1e730 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1e740 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
1e750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
1e760 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20  ee page off the 
1e770 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1e780 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
1e790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e7a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1e7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e7c0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1e7d0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
1e7e0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
1e7f0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
1e800 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
1e810 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e830 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
1e840 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
1e850 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
1e860 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
1e870 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
1e880 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
1e890 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
1e8a0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
1e8b0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1e8c0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1e8d0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
1e8e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
1e8f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1e900 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
1e910 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a  no, ppPage, 1);.
1e920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e930 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e940 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e950 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1e960 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ack((*ppPage)->p
1e970 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e980 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e990 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
1e9a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
1e9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e9c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e9e0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
1e9f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1ea00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1ea10 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
1ea20 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
1ea30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ea40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ea50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
1ea60 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
1ea70 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
1ea80 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
1ea90 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
1eaa0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
1eab0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
1eac0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
1ead0 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
1eae0 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
1eaf0 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20  e */.    *pPgno 
1eb00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1eb10 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1eb20 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64  ger) + 1;..#ifnd
1eb30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1eb40 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1eb50 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b  ( pBt->nTrunc ){
1eb60 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63  .      /* An inc
1eb70 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72  r-vacuum has alr
1eb80 65 61 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20  eady run within 
1eb90 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1eba0 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  . So the.      *
1ebb0 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61  * page to alloca
1ebc0 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74  te is not from t
1ebd0 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20  he physical end 
1ebe0 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74  of the file, but
1ebf0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74  .      ** at pBt
1ec00 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20  ->nTrunc. .     
1ec10 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f   */.      *pPgno
1ec20 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31   = pBt->nTrunc+1
1ec30 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
1ec40 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
1ec50 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1ec60 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1ec70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ec80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1ec90 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
1eca0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70  P_ISPAGE(pBt, *p
1ecb0 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
1ecc0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
1ecd0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
1ece0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
1ecf0 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
1ed00 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
1ed10 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1ed20 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
1ed30 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
1ed40 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
1ed50 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
1ed60 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1ed70 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
1ed80 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
1ed90 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
1eda0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1edb0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
1edc0 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
1edd0 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
1ede0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20   *pPgno));.     
1edf0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1ee00 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ee10 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
1ee20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
1ee30 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1ee40 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
1ee50 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70  pBt->nTrunc = *p
1ee60 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Pgno;.    }.#end
1ee70 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
1ee80 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1ee90 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1eea0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1eeb0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1eec0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1eed0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1eee0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1eef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ef00 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
1ef10 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1ef20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ef30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ef40 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
1ef50 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
1ef60 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1ef70 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
1ef80 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
1ef90 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1efa0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1efb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1efc0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
1efd0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
1efe0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
1eff0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1f000 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  evTrunk);.  retu
1f010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f020 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68  Add a page of th
1f030 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f040 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1f050 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  .**.** sqlite3Pa
1f060 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f  gerUnref() is NO
1f070 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61  T called for pPa
1f080 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1f090 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  t freePage(MemPa
1f0a0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74  ge *pPage){.  Bt
1f0b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1f0c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  age->pBt;.  MemP
1f0d0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1f0e0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  t->pPage1;.  int
1f0f0 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a   rc, n, k;..  /*
1f100 20 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67   Prepare the pag
1f110 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f  e for freeing */
1f120 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f130 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
1f140 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1f150 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1f160 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29   pPage->pgno>1 )
1f170 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
1f180 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  t = 0;.  release
1f190 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72  Page(pPage->pPar
1f1a0 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  ent);.  pPage->p
1f1b0 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  Parent = 0;..  /
1f1c0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1f1d0 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
1f1e0 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
1f1f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f200 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1f210 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1f220 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f230 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1f240 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1f250 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
1f260 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1f270 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53   n+1);..#ifdef S
1f280 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1f290 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ETE.  /* If the 
1f2a0 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
1f2b0 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  LETE compile-tim
1f2c0 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
1f2d0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  led, then.  ** a
1f2e0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
1f2f0 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
1f300 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
1f310 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  eros..  */.  rc 
1f320 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f330 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
1f340 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1f350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1f360 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
1f370 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
1f380 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64  >pageSize);.#end
1f390 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1f3a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1f3b0 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  UM.  /* If the d
1f3c0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
1f3d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
1f3e0 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
1f3f0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
1f400 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
1f410 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
1f420 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
1f430 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1f440 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  um ){.    rc = p
1f450 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50  trmapPut(pBt, pP
1f460 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  age->pgno, PTRMA
1f470 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a  P_FREEPAGE, 0);.
1f480 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f490 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
1f4a0 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  if..  if( n==0 )
1f4b0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
1f4c0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
1f4d0 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  page */.    rc =
1f4e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f4f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1f500 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1f510 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f520 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
1f530 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ata, 0, 8);.    
1f540 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1f550 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
1f560 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54  ge->pgno);.    T
1f570 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
1f580 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70  : %d first\n", p
1f590 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
1f5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74  }else{.    /* Ot
1f5b0 68 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61  her free pages a
1f5c0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52  lready exist.  R
1f5d0 65 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74  etrive the first
1f5e0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
1f5f0 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ** of the freeli
1f600 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20  st and find out 
1f610 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20  how many leaves 
1f620 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d  it has. */.    M
1f630 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a  emPage *pTrunk;.
1f640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f650 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1f660 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
1f670 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20  e1->aData[32]), 
1f680 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
1f690 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f6a0 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74   rc;.    k = get
1f6b0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1f6c0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66  Data[4]);.    if
1f6d0 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ( k>=pBt->usable
1f6e0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
1f6f0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1f700 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20   is full.  Turn 
1f710 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
1f720 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a  reed into a new.
1f730 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70        ** trunk p
1f740 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76  age with no leav
1f750 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  es. */.      rc 
1f760 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f770 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
1f780 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
1f790 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1f7a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
1f7b0 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75  age->aData, pTru
1f7c0 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nk->pgno);.     
1f7d0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1f7e0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
1f7f0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f800 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f810 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1f820 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
1f830 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
1f840 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
1f850 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20  acing %d\n",.   
1f860 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1f870 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e  ->pgno, pTrunk->
1f880 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
1f890 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  e{.      /* Add 
1f8a0 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20  the newly freed 
1f8b0 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f  page as a leaf o
1f8c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
1f8d0 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  unk */.      rc 
1f8e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f8f0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1f900 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
1f910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f920 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1f930 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1f940 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20  [4], k+1);.     
1f950 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
1f960 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34  unk->aData[8+k*4
1f970 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1f980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f990 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1f9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f9b0 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
1f9c0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e  e->pDbPage);.#en
1f9d0 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
1f9e0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1f9f0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
1fa00 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
1fa10 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
1fa20 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
1fa30 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
1fa40 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
1fa50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fa60 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
1fa70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1fa80 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1fa90 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
1faa0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
1fab0 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
1fac0 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
1fad0 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
1fae0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1faf0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
1fb00 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
1fb10 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
1fb20 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
1fb30 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
1fb40 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
1fb50 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
1fb60 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e  utexHeld(pPage->
1fb70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1fb80 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
1fb90 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
1fba0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1fbb0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
1fbc0 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
1fbd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fbe0 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
1fbf0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
1fc00 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1fc10 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
1fc20 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
1fc30 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
1fc40 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76  Overflow]);.  ov
1fc50 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
1fc60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1fc70 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
1fc80 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
1fc90 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
1fca0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
1fcb0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
1fcc0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
1fcd0 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
1fce0 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
1fcf0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
1fd00 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
1fd10 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76  vflPgno==0 || ov
1fd20 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  flPgno>sqlite3Pa
1fd30 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1fd40 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
1fd50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fd60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fd70 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67     }..    rc = g
1fd80 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
1fd90 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
1fda0 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29  Ovfl, (nOvfl==0)
1fdb0 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  ?0:&ovflPgno);. 
1fdc0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1fdd0 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
1fde0 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
1fdf0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1fe00 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
1fe10 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1fe20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1fe30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1fe40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1fe50 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
1fe60 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
1fe70 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
1fe80 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
1fe90 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
1fea0 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
1feb0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
1fec0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
1fed0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
1fee0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
1fef0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
1ff00 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1ff10 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
1ff20 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1ff30 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
1ff40 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
1ff50 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
1ff60 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
1ff70 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
1ff80 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
1ff90 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
1ffa0 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
1ffb0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
1ffc0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
1ffd0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
1ffe0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
1fff0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
20000 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
20010 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
20020 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
20030 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
20040 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
20050 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
20060 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
20070 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
20080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
20090 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
200a0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
200b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
200c0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
200d0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
200e0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
200f0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
20100 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
20110 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
20120 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
20130 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
20140 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
20150 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20170 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
20180 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
20190 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
201a0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
201b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
201c0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
201d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
201e0 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
201f0 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
20200 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
20210 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
20220 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
20230 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
20240 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
20250 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
20260 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
20270 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
20280 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20290 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
202a0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
202b0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
202c0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
202d0 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
202e0 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
202f0 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  Held(pPage->pBt-
20300 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
20310 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
20320 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
20330 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
20340 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20350 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
20360 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
20370 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
20380 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
20390 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
203a0 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
203b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
203c0 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
203d0 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
203e0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
203f0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
20400 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
20410 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
20420 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
20430 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
20440 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
20450 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
20460 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
20470 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
20480 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
20490 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f  ata==nData+nZero
204a0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
204b0 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
204c0 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
204d0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
204e0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
204f0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
20500 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
20510 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
20520 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
20530 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  {.    nPayload +
20540 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  = nKey;.    pSrc
20550 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
20560 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  c = nKey;.  }.  
20570 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
20580 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
20590 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
205a0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
205b0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
205c0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
205d0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
205e0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
205f0 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
20600 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
20610 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78  {.      int isEx
20620 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  act = 0;.#ifndef
20630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20640 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
20650 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
20660 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
20670 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
20680 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
20690 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
206a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
206b0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
206c0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
206d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
206e0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
206f0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
20700 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
20710 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
20720 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20730 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
20740 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66       if( pgnoOvf
20750 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l>1 ){.         
20760 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b   /* isExact = 1;
20770 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
20780 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20790 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
207a0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
207b0 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
207c0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78  , pgnoOvfl, isEx
207d0 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  act);.#ifndef SQ
207e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
207f0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
20800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
20810 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
20820 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
20830 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
20840 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
20850 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
20860 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
20870 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
20880 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
20890 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
208a0 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
208b0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
208c0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
208d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
208e0 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
208f0 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
20900 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
20910 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
20920 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
20930 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
20940 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
20950 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
20960 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
20970 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
20980 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
20990 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
209a0 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
209b0 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
209c0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
209d0 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
209e0 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
209f0 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
20a00 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
20a10 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
20a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20a30 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
20a40 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
20a50 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
20a60 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
20a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
20a80 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
20a90 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
20aa0 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
20ab0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20ac0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20ad0 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
20ae0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
20af0 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
20b00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
20b10 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
20b20 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
20b30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
20b40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
20b50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
20b60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20b70 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
20b80 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
20b90 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
20ba0 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
20bb0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
20bc0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
20bd0 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
20be0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
20bf0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
20c00 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
20c10 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
20c20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
20c30 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
20c40 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
20c50 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28  aceLeft;.    if(
20c60 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
20c70 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
20c80 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
20c90 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
20ca0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
20cb0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
20cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20cd0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
20ce0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
20cf0 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
20d00 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
20d10 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
20d20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
20d30 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
20d40 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
20d50 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
20d60 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
20d70 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
20d80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
20d90 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
20da0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
20db0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20dc0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65  ** Change the Me
20dd0 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f  mPage.pParent po
20de0 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67  inter on the pag
20df0 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69  e whose number i
20e00 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  s.** given in th
20e10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
20e20 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67  t so that MemPag
20e30 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  e.pParent holds 
20e40 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  the.** pointer i
20e50 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  n the third argu
20e60 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
20e70 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65  int reparentPage
20e80 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
20e90 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61  Pgno pgno, MemPa
20ea0 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20  ge *pNewParent, 
20eb0 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50  int idx){.  MemP
20ec0 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62  age *pThis;.  Db
20ed0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
20ee0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20ef0 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
20f00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
20f10 20 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72   assert( pNewPar
20f20 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ent!=0 );.  if( 
20f30 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
20f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
20f50 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
20f60 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50 61 67  r!=0 );.  pDbPag
20f70 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
20f80 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
20f90 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
20fa0 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
20fb0 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67 65  pThis = (MemPage
20fc0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
20fd0 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
20fe0 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d  ;.    if( pThis-
20ff0 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20  >isInit ){.     
21000 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e   assert( pThis->
21010 61 44 61 74 61 3d 3d 28 73 71 6c 69 74 65 33 50  aData==(sqlite3P
21020 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
21030 61 67 65 29 29 20 29 3b 0a 20 20 20 20 20 20 69  age)) );.      i
21040 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  f( pThis->pParen
21050 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b  t!=pNewParent ){
21060 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 68  .        if( pTh
21070 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71  is->pParent ) sq
21080 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21090 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e  pThis->pParent->
210a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
210b0 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74    pThis->pParent
210c0 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20   = pNewParent;. 
210d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
210e0 67 65 72 52 65 66 28 70 4e 65 77 50 61 72 65 6e  gerRef(pNewParen
210f0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
21100 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73     }.      pThis
21110 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64  ->idxParent = id
21120 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  x;.    }.    sql
21130 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
21140 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69  DbPage);.  }..#i
21150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21160 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
21170 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
21180 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  um ){.    return
21190 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
211a0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
211b0 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e  EE, pNewParent->
211c0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pgno);.  }.#endi
211d0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
211e0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
211f0 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61 72   Change the pPar
21200 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61  ent pointer of a
21210 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
21220 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61  Page to point ba
21230 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a  ck.** to pPage..
21240 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
21250 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20  ords, for every 
21260 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20  child of pPage, 
21270 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50  invoke reparentP
21280 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65  age().** to make
21290 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68 20   sure that each 
212a0 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74  child knows that
212b0 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70 61   pPage is its pa
212c0 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rent..**.** This
212d0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
212e0 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d  lled after you m
212f0 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65  emcpy() one page
21300 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72   into.** another
21310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21320 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
21330 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  es(MemPage *pPag
21340 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  e){.  int i;.  B
21350 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21360 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
21370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21380 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
21390 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c  te3BtreeMutexHel
213a0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
213b0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
213c0 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75  age->leaf ) retu
213d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
213e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
213f0 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
21400 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
21410 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
21420 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
21430 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
21440 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50    rc = reparentP
21450 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
21460 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c  e(pCell), pPage,
21470 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   i);.      if( r
21480 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
21490 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
214a0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
214b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
214c0 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
214d0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
214e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
214f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
21500 2c 20 0a 20 20 20 20 20 20 20 70 50 61 67 65 2c  , .       pPage,
21510 20 69 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   i);.    pPage->
21520 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
21530 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21540 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
21550 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
21560 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
21570 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
21580 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
21590 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
215a0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
215b0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
215c0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
215d0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
215e0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
215f0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
21600 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
21610 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
21620 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
21630 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
21640 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
21650 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
21660 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
21670 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
21680 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
21690 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
216a0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
216b0 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
216c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
216d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
216e0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
216f0 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
21700 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
21710 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
21720 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
21730 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
21740 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
21750 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
21760 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
21770 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
21780 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
21790 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
217a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
217b0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
217c0 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
217d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
217e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
217f0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
21800 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
21810 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
21820 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e  utexHeld(pPage->
21830 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
21840 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
21850 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
21860 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
21870 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
21880 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
21890 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
218a0 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
218b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
218c0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
218d0 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
218e0 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
218f0 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
21900 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
21910 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
21920 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
21930 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
21940 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
21950 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
21960 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
21970 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
21980 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
21990 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
219a0 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
219b0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
219c0 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
219d0 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
219e0 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
219f0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
21a00 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
21a10 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
21a20 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
21a30 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
21a40 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
21a50 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
21a60 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
21a70 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
21a80 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
21a90 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
21aa0 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
21ab0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
21ac0 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
21ad0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
21ae0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
21af0 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
21b00 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
21b10 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
21b20 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
21b30 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
21b40 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
21b50 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
21b60 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
21b70 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
21b80 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
21b90 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
21ba0 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
21bb0 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
21bc0 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
21bd0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
21be0 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
21bf0 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
21c00 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
21c10 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
21c20 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
21c30 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
21c40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
21c50 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
21c60 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
21c70 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
21c80 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
21c90 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
21ca0 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
21cb0 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
21cc0 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
21cd0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
21ce0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
21cf0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
21d00 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
21d10 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
21d20 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
21d30 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
21d40 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
21d50 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
21d60 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
21d70 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
21d80 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
21d90 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
21da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
21db0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
21dc0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
21dd0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
21de0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
21df0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
21e00 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
21e10 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
21e20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
21e30 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
21e40 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
21e50 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
21e60 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
21e70 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
21e80 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
21e90 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
21ea0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
21eb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21ec0 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
21ed0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
21ee0 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
21ef0 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
21f00 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
21f10 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
21f20 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
21f30 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
21f40 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
21f50 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
21f60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21f70 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
21f80 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
21f90 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
21fa0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
21fb0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
21fc0 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
21fd0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
21fe0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
21ff0 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
22000 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
22010 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
22020 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
22030 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22040 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
22050 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
22060 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
22070 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
22080 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
22090 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
220a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
220b0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
220c0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
220d0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
220e0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
220f0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
22100 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
22110 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
22120 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  Held(pPage->pBt-
22130 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
22140 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
22150 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
22160 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
22170 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
22180 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
22190 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
221a0 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
221b0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
221c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
221d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
221e0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
221f0 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  j<sizeof(pPage->
22200 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
22210 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29  age->aOvfl[0]) )
22220 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
22230 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
22240 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
22250 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69  aOvfl[j].idx = i
22260 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
22270 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
22280 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
22290 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
222a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
222b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
222c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
222d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
222e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
222f0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
22300 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
22310 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
22320 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
22330 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
22340 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
22350 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
22360 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
22370 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
22380 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
22390 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
223a0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
223b0 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20  e->nCell + 2;.  
223c0 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
223d0 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66  et + 2*i;.    if
223e0 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a  ( end > top - sz
223f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64   ){.      rc = d
22400 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
22410 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
22420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
22440 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
22450 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
22460 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64       assert( end
22470 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a   + sz <= top );.
22480 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20      }.    idx = 
22490 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
224a0 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73  age, sz);.    as
224b0 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20  sert( idx>0 );. 
224c0 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c     assert( end <
224d0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
224e0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20  [hdr+5]) );.    
224f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
22500 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
22510 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70   -= 2;.    memcp
22520 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
22530 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
22540 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
22550 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72  for(j=end-2, ptr
22560 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73  =&data[j]; j>ins
22570 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b  ; j-=2, ptr-=2){
22580 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  .      ptr[0] = 
22590 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
225a0 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b  tr[1] = ptr[-1];
225b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
225c0 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
225d0 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
225e0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
225f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
22600 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68      pPage->idxSh
22610 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  ift = 1;.#ifndef
22620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22630 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
22640 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
22650 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
22660 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
22670 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
22680 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
22690 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
226a0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
226b0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
226c0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
226d0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
226e0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
226f0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
22700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
22710 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
22720 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
22730 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nfo);.      asse
22740 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
22750 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
22760 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
22770 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
22780 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e       if( (info.n
22790 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
227a0 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
227b0 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  )>info.nLocal ){
227c0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
227d0 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
227e0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
227f0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
22800 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
22810 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
22820 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
22830 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
22840 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
22850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22860 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
22870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
22880 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
22890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
228a0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
228b0 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
228c0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
228d0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
228e0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
228f0 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
22900 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
22910 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
22920 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
22930 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
22940 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
22950 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
22960 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
22970 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
22980 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
22990 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
229a0 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
229b0 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
229c0 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
229d0 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
229e0 20 69 6e 74 20 2a 61 53 69 7a 65 20 20 20 20 20   int *aSize     
229f0 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
22a00 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
22a10 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
22a20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22a30 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61  er */.  int tota
22a40 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74  lSize;    /* Tot
22a50 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
22a60 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ells */.  int hd
22a70 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
22a80 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61  ndex of page hea
22a90 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
22aa0 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64  lptr;      /* Ad
22ab0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
22ac0 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
22ad0 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
22ae0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
22af0 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
22b00 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
22b10 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
22b20 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  r the page */.. 
22b30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
22b40 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
22b50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22b60 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
22b70 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22b80 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  x) );.  totalSiz
22b90 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 0;.  for(i=0
22ba0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
22bb0 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b  .    totalSize +
22bc0 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a  = aSize[i];.  }.
22bd0 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53    assert( totalS
22be0 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61  ize+2*nCell<=pPa
22bf0 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61  ge->nFree );.  a
22c00 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
22c10 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c  ell==0 );.  cell
22c20 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  ptr = pPage->cel
22c30 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  lOffset;.  data 
22c40 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
22c50 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
22c60 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32  drOffset;.  put2
22c70 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
22c80 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28  ], nCell);.  if(
22c90 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65   nCell ){.    ce
22ca0 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74  llbody = allocat
22cb0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f  eSpace(pPage, to
22cc0 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73  talSize);.    as
22cd0 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30  sert( cellbody>0
22ce0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22cf0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20  pPage->nFree >= 
22d00 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  2*nCell );.    p
22d10 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
22d20 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28  *nCell;.    for(
22d30 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
22d40 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79  +){.      put2by
22d50 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72  te(&data[cellptr
22d60 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
22d70 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
22d80 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
22d90 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
22da0 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20  ;.      cellptr 
22db0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c  += 2;.      cell
22dc0 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  body += aSize[i]
22dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22de0 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50  rt( cellbody==pP
22df0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
22e00 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50  Size );.  }.  pP
22e10 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65  age->nCell = nCe
22e20 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
22e30 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
22e40 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
22e50 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
22e60 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
22e70 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
22e80 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
22e90 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
22ea0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
22eb0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
22ec0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
22ed0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
22ee0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
22ef0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
22f00 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
22f10 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
22f20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
22f30 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
22f40 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
22f50 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
22f60 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
22f70 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
22f80 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
22f90 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
22fa0 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
22fb0 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
22fc0 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
22fd0 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
22fe0 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
22ff0 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
23000 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
23010 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
23020 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
23030 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
23040 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
23050 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
23060 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
23070 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
23080 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
23090 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
230a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
230b0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
230c0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
230d0 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
230e0 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
230f0 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
23100 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
23110 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f  alance */../* Fo
23120 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
23130 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
23140 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20  lance(MemPage*, 
23150 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  int);..#ifndef S
23160 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
23170 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
23180 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
23190 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
231a0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
231b0 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
231c0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
231d0 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
231e0 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
231f0 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
23200 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
23210 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
23220 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
23230 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
23240 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
23250 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
23260 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
23270 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
23280 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
23290 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
232a0 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
232b0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
232c0 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
232d0 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
232e0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
232f0 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
23300 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
23310 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
23320 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
23330 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
23340 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
23350 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
23360 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
23370 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
23380 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
23390 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
233a0 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
233b0 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
233c0 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
233d0 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
233e0 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
233f0 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
23400 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
23410 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
23420 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
23430 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
23440 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
23450 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
23460 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
23470 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
23480 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
23490 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
234a0 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65   *pPage, MemPage
234b0 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e   *pParent){.  in
234c0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
234d0 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67  *pNew;.  Pgno pg
234e0 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65  noNew;.  u8 *pCe
234f0 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c  ll;.  int szCell
23500 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
23510 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  o;.  BtShared *p
23520 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
23530 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78  .  int parentIdx
23540 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
23550 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20  l;   /* pParent 
23560 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
23570 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
23580 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20  parentSize;     
23590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
235a0 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76   Size of new div
235b0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75  ider cell */.  u
235c0 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d  8 parentCell[64]
235d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
235e0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68   /* Space for th
235f0 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
23600 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
23610 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
23620 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  exHeld(pPage->pB
23630 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
23640 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
23650 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74  w page. Insert t
23660 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
23670 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a   from pPage.  **
23680 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72   into it. Then r
23690 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c  emove the overfl
236a0 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
236b0 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ge..  */.  rc = 
236c0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
236d0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
236e0 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  gnoNew, 0, 0);. 
236f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23700 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
23710 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c   rc;.  }.  pCell
23720 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b   = pPage->aOvfl[
23730 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65  0].pCell;.  szCe
23740 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
23750 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
23760 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
23770 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
23780 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67  );.  assemblePag
23790 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
237a0 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70  l, &szCell);.  p
237b0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
237c0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  = 0;..  /* Set t
237d0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65  he parent of the
237e0 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
237f0 20 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74   page to pParent
23800 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61  . */.  pNew->pPa
23810 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a  rent = pParent;.
23820 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
23830 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
23840 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ge);..  /* pPage
23850 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68   is currently th
23860 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
23870 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65   pParent. Change
23880 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68   this.  ** so th
23890 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  at the right-chi
238a0 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61  ld is the new pa
238b0 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  ge allocated abo
238c0 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67  ve and.  ** pPag
238d0 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f  e is the next-to
238e0 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20  -right child. . 
238f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
23900 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
23910 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
23920 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
23930 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c  >nCell-1);.  sql
23940 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
23950 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
23960 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63  ll, &info);.  rc
23970 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
23980 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c  arent, parentCel
23990 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
239a0 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e   0, 0, 0, &paren
239b0 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  tSize);.  if( rc
239c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
239d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
239e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65  }.  assert( pare
239f0 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72  ntSize<64 );.  r
23a00 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
23a10 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64  Parent, parentId
23a20 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70  x, parentCell, p
23a30 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29  arentSize, 0, 4)
23a40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23a50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23a60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75  urn rc;.  }.  pu
23a70 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
23a80 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
23a90 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67  parentIdx), pPag
23aa0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34  e->pgno);.  put4
23ab0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
23ac0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
23ad0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
23ae0 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  New);..#ifndef S
23af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
23b00 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
23b10 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
23b20 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
23b30 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
23b40 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20  r map.  ** with 
23b50 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
23b60 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
23b70 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
23b80 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  he .  ** cell on
23b90 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
23ba0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
23bb0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
23bc0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
23bd0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
23be0 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
23bf0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
23c00 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
23c10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23c20 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
23c30 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e  ptrmapPutOvfl(pN
23c40 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ew, 0);.    }.  
23c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
23c70 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
23c80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
23ca0 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  f..  /* Release 
23cb0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
23cc0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e   the new page an
23cd0 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61  d balance the pa
23ce0 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20  rent page,.  ** 
23cf0 69 6e 20 63 61 73 65 20 74 68 65 20 64 69 76 69  in case the divi
23d00 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65  der cell inserte
23d10 64 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62  d caused it to b
23d20 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a  ecome overfull..
23d30 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61    */.  releasePa
23d40 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ge(pNew);.  retu
23d50 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65  rn balance(pPare
23d60 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  nt, 0);.}.#endif
23d70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23d80 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
23d90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
23da0 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65  ine redistribute
23db0 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  s Cells on pPage
23dc0 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20   and up to NN*2 
23dd0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70  siblings.** of p
23de0 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c  Page so that all
23df0 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
23e00 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e  t the same amoun
23e10 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e  t of free space.
23e20 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73  .** Usually NN s
23e30 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65  iblings on eithe
23e40 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
23e50 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  is used in the b
23e60 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f  alancing,.** tho
23e70 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67  ugh more sibling
23e80 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
23e90 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50  m one side if pP
23ea0 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
23eb0 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  .** or last chil
23ec0 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
23ed0 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66    If pPage has f
23ee0 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73  ewer than 2*NN s
23ef0 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65  iblings.** (some
23f00 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
23f10 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70  only happen if p
23f20 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74  Page is the root
23f30 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63   page or a .** c
23f40 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68  hild of root) th
23f50 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  en all available
23f60 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63   siblings partic
23f70 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
23f80 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
23f90 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
23fa0 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69  ings of pPage mi
23fb0 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
23fc0 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
23fd0 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69   one or.** two i
23fe0 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
23ff0 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
24000 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
24010 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f  er full. The roo
24020 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65  t page.** is spe
24030 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f  cial and is allo
24040 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79  wed to be nearly
24050 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65   empty. If pPage
24060 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   is .** the root
24070 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
24080 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65  depth of the tre
24090 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
240a0 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65  ased.** or decre
240b0 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20  ased by one, as 
240c0 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65  necessary, to ke
240d0 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ep the root page
240e0 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f   from being.** o
240f0 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c  verfull or compl
24100 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a  etely empty..**.
24110 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65  ** Note that whe
24120 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
24130 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f  s called, some o
24140 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70  f the Cells on p
24150 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  Page.** might no
24160 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
24170 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61  ored in pPage->a
24180 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61  Data[].  This ca
24190 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
241a0 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
241b0 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68  ull.  Part of th
241c0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
241d0 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d  utine is to.** m
241e0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c  ake sure all Cel
241f0 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63  ls for pPage onc
24200 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70  e again fit in p
24210 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a  Page->aData[]..*
24220 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
24230 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
24240 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20  the siblings of 
24250 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e  pPage, the paren
24260 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69  t of pPage.** mi
24270 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66  ght become overf
24280 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
24290 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65  .  If that happe
242a0 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ns, then this ro
242b0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
242c0 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ed recursively o
242d0 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a  n the parent..**
242e0 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
242f0 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  ine fails for an
24300 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67  y reason, it mig
24310 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  ht leave the dat
24320 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f  abase.** in a co
24330 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20  rrupted state.  
24340 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
24350 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
24360 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
24370 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
24380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
24390 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d  alance_nonroot(M
243a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
243b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
243c0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
243d0 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20  * The parent of 
243e0 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61  pPage */.  BtSha
243f0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
24400 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
24410 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
24420 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
24430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24440 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
24450 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
24460 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
24470 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
24480 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
24490 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
244a0 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
244b0 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20    int nOld;     
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
244d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
244e0 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
244f0 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20    int nNew;     
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24510 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
24520 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
24530 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20    int nDiv;     
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24550 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
24560 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a  s in apDiv[] */.
24570 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24590 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
245a0 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  */.  int idx;   
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50    /* Index of pP
245d0 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  age in pParent->
245e0 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
245f0 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
24600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
24610 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
24620 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
24630 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
24660 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
24670 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
24680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
24690 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
246a0 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
246b0 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
246d0 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
246e0 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
246f0 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
24700 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
24710 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
24720 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
24730 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
24740 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
24750 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
24760 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
24770 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
24780 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
24790 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
247a0 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
247b0 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
247c0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
247d0 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20 30    int iSpace = 0
247e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
247f0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
24800 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b 5d 20  yte of aSpace[] 
24810 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
24820 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
24830 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
24840 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
24850 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
24860 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
24870 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
24880 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
24890 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
248a0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
248b0 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
248c0 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
248d0 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
248e0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
248f0 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
24900 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
24910 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
24920 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
24930 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
24940 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
24950 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
24960 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
24970 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
24980 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d  .  u8 *apDiv[NB]
24990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
249a0 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
249b0 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
249c0 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
249d0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
249e0 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
249f0 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
24a00 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
24a10 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
24a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
24a30 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
24a40 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
24a50 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
24a60 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
24a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
24a80 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
24a90 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
24aa0 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
24ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
24ac0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
24ad0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
24ae0 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e  */.  u8 *aCopy[N
24af0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
24b00 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68    /* Space for h
24b10 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61  olding data of a
24b20 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCopy[] */.  u8 
24b30 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *aSpace;        
24b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
24b50 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65  ce to hold copie
24b60 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
24b70 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  lls */.#ifndef S
24b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24b90 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f  ACUUM.  u8 *aFro
24ba0 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  m = 0;.#endif.. 
24bb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24bc0 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
24bd0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
24be0 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  ) );..  /* .  **
24bf0 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   Find the parent
24c00 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
24c10 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
24c20 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
24c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
24c40 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
24c50 70 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67  pDbPage) || pPag
24c60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
24c70 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
24c80 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74  ->pBt;.  pParent
24c90 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
24ca0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
24cb0 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51  rent );.  if( SQ
24cc0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
24cd0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24ce0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
24cf0 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e)) ){.    retur
24d00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43  n rc;.  }.  TRAC
24d10 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
24d20 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
24d30 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
24d40 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
24d50 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  >pgno));..#ifnde
24d60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
24d70 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a  ICKBALANCE.  /*.
24d80 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63    ** A special c
24d90 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65  ase:  If a new e
24da0 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65  ntry has just be
24db0 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
24dc0 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74   a.  ** table (t
24dd0 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20  hat is, a btree 
24de0 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79  with integer key
24df0 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61  s and all data a
24e00 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20  t the leaves).  
24e10 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65  ** and the new e
24e20 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68  ntry is the righ
24e30 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20  t-most entry in 
24e40 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73  the tree (it has
24e50 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73   the.  ** larges
24e60 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20  t key) then use 
24e70 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61  the special bala
24e80 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74  nce_quick() rout
24e90 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c  ine for.  ** bal
24ea0 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65  ancing.  balance
24eb0 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68  _quick() is much
24ec0 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75   faster and resu
24ed0 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72  lts in a tighter
24ee0 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66  .  ** packing of
24ef0 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d   data in the com
24f00 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  mon case..  */. 
24f10 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
24f20 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
24f30 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20  >intKey &&.     
24f40 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
24f50 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
24f60 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26  >nOverflow==1 &&
24f70 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  .      pPage->aO
24f80 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
24f90 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20  e->nCell &&.    
24fa0 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
24fb0 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20  ->pgno!=1 &&.   
24fc0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
24fd0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
24fe0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
24ff0 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a  ])==pPage->pgno.
25000 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20    ){.    /*.    
25010 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74  ** TODO: Check t
25020 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74  he siblings to t
25030 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65  he left of pPage
25040 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74  . It may be that
25050 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65  .    ** they are
25060 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f   not full and no
25070 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71   new page is req
25080 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
25090 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
250a0 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50  _quick(pPage, pP
250b0 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  arent);.  }.#end
250c0 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  if..  if( SQLITE
250d0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
250e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
250f0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  ge->pDbPage)) ){
25100 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
25110 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
25120 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
25130 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
25140 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
25150 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
25160 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
25170 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
25180 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
25190 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
251a0 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
251b0 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
251c0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
251d0 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
251e0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
251f0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
25200 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20  idxShift ){.    
25210 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70  Pgno pgno;.    p
25220 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
25230 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
25240 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
25250 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
25260 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
25270 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64     for(idx=0; id
25280 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  x<pParent->nCell
25290 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20  ; idx++){.      
252a0 69 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  if( get4byte(fin
252b0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
252c0 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20  dx))==pgno ){.  
252d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
252e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
252f0 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65  ssert( idx<pPare
25300 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  nt->nCell.      
25310 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79         || get4by
25320 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
25330 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
25340 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20  ffset+8])==pgno 
25350 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25360 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78  idx = pPage->idx
25370 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f  Parent;.  }..  /
25380 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  *.  ** Initializ
25390 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74  e variables so t
253a0 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73  hat it will be s
253b0 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a  afe to jump.  **
253c0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c   directly to bal
253d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20  ance_cleanup at 
253e0 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f  any moment..  */
253f0 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d  .  nOld = nNew =
25400 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   0;.  sqlite3Pag
25410 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70  erRef(pParent->p
25420 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20  DbPage);..  /*. 
25430 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
25440 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
25450 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
25460 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
25470 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
25480 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
25490 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
254a0 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
254b0 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
254c0 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
254d0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
254e0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
254f0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
25500 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
25510 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
25520 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
25530 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
25540 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
25550 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
25560 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
25570 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
25580 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
25590 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
255a0 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
255b0 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
255c0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
255d0 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
255e0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
255f0 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
25600 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
25610 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
25620 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
25630 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
25640 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
25650 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
25660 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
25670 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
25680 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
25690 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
256a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
256b0 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
256c0 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
256d0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
256e0 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
256f0 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
25700 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
25710 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
25720 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
25730 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
25740 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
25750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
25760 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25770 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
25780 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
25790 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20  [i], &apOld[i], 
257a0 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  pParent);.    if
257b0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
257c0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
257d0 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61   apOld[i]->idxPa
257e0 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70  rent = k;.    ap
257f0 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Copy[i] = 0;.   
25800 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64   assert( i==nOld
25810 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a   );.    nOld++;.
25820 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
25830 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
25840 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
25850 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  erflow;.  }..  /
25860 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
25870 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32   a multiple of 2
25880 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
25890 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
258a0 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
258b0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
258c0 61 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b  axCells + 1)&~1;
258d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
258e0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
258f0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
25900 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  .  */.  apCell =
25910 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
25920 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c   .       nMaxCel
25930 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
25940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25950 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
25960 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
25970 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 69 6e  xCells*sizeof(in
25980 74 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t)              
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
259a0 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
259b0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
259c0 65 6d 50 61 67 65 29 29 2a 4e 42 20 20 20 20 20  emPage))*NB     
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20   /* aCopy */.   
259f0 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
25a00 65 2a 28 35 2b 4e 42 29 20 20 20 20 20 20 20 20  e*(5+NB)        
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f      /* aSpace */
25a30 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
25a40 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
25a50 73 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20  s : 0)          
25a60 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d          /* aFrom
25a70 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 61   */.  );.  if( a
25a80 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
25a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25aa0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
25ab0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
25ac0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74  .  szCell = (int
25ad0 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
25ae0 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d  lls];.  aCopy[0]
25af0 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
25b00 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
25b10 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d  sert( ((aCopy[0]
25b20 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
25b30 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
25b40 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
25b50 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72  equired */.  for
25b60 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29  (i=1; i<NB; i++)
25b70 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d  {.    aCopy[i] =
25b80 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74   &aCopy[i-1][pBt
25b90 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
25ba0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
25bb0 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ))];.    assert(
25bc0 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75   ((aCopy[i] - (u
25bd0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
25be0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
25bf0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
25c00 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61  ed */.  }.  aSpa
25c10 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31  ce = &aCopy[NB-1
25c20 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
25c30 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
25c40 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65  mPage))];.  asse
25c50 72 74 28 20 28 28 61 53 70 61 63 65 20 2d 20 28  rt( ((aSpace - (
25c60 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
25c70 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
25c80 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
25c90 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  red */.#ifndef S
25ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25cb0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
25cc0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
25cd0 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61     aFrom = &aSpa
25ce0 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53 69  ce[5*pBt->pageSi
25cf0 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ze];.  }.#endif.
25d00 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b    .  /*.  ** Mak
25d10 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
25d20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65  content of pPage
25d30 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
25d40 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20  s into aOld[].. 
25d50 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
25d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
25d70 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
25d80 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
25d90 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  er.  ** that the
25da0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
25db0 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
25dc0 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
25dd0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f   in the.  ** pro
25de0 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
25df0 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  erwritten..  */.
25e00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
25e10 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
25e20 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79  Page *p = apCopy
25e30 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
25e40 26 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70  &aCopy[i][pBt->p
25e50 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 2d  ageSize];.    p-
25e60 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
25e70 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  p)[-pBt->pageSiz
25e80 65 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e];.    memcpy(p
25e90 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
25ea0 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
25eb0 61 67 65 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66  ageSize + sizeof
25ec0 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
25ed0 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20  /* The memcpy() 
25ee0 61 62 6f 76 65 20 63 68 61 6e 67 65 73 20 74 68  above changes th
25ef0 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 61 44  e value of p->aD
25f00 61 74 61 20 73 6f 20 77 65 20 68 61 76 65 20 74  ata so we have t
25f10 6f 0a 20 20 20 20 2a 2a 20 73 65 74 20 69 74 20  o.    ** set it 
25f20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d  again. */.    p-
25f30 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
25f40 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  p)[-pBt->pageSiz
25f50 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  e];.  }..  /*.  
25f60 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
25f70 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
25f80 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
25f90 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
25fa0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
25fb0 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
25fc0 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
25fd0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
25fe0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
25ff0 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
26000 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b  ned form aSpace[
26010 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
26020 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
26030 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
26040 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
26050 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
26060 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
26070 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
26080 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
26090 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
260a0 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
260b0 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
260c0 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
260d0 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
260e0 6f 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20  o aSpace[].  In 
260f0 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
26100 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
26110 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
26120 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
26130 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
26140 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
26150 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
26160 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
26170 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
26180 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
26190 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
261a0 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
261b0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
261c0 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
261d0 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
261e0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
261f0 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
26200 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
26210 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
26220 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
26230 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
26240 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
26250 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20  .  */.  nCell = 
26260 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  0;.  leafCorrect
26270 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ion = pPage->lea
26280 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
26290 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  = pPage->leafDat
262a0 61 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66  a && pPage->leaf
262b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
262c0 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
262d0 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
262e0 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e  pCopy[i];.    in
262f0 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e  t limit = pOld->
26300 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65  nCell+pOld->nOve
26310 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a  rflow;.    for(j
26320 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
26330 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
26340 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
26350 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c   );.      apCell
26360 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76  [nCell] = findOv
26370 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c  erflowCell(pOld,
26380 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c   j);.      szCel
26390 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
263a0 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
263b0 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66  ell[nCell]);.#if
263c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
263d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
263e0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
263f0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
26400 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20   int a;.        
26410 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69  aFrom[nCell] = i
26420 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d  ;.        for(a=
26430 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72  0; a<pOld->nOver
26440 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20  flow; a++){.    
26450 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
26460 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d  aOvfl[a].pCell==
26470 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b  apCell[nCell] ){
26480 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72  .            aFr
26490 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
264a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
264b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
264c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
264d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
264e0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
264f0 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
26500 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  ){.      int sz 
26510 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
26520 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
26530 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
26540 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
26550 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46  /* With the LEAF
26560 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65  DATA flag, pPare
26570 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e  nt cells hold on
26580 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a  ly INTKEYs that.
26590 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64          ** are d
265a0 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79  uplicates of key
265b0 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70  s on the child p
265c0 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74  ages.  We need t
265d0 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20  o remove.       
265e0 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20   ** the divider 
265f0 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65  cells from pPare
26600 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69  nt, but the divi
26610 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e  ders cells are n
26620 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  ot.        ** ad
26630 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20  ded to apCell[] 
26640 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65  because they are
26650 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63   duplicates of c
26660 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20  hild cells..    
26670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64      */.        d
26680 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
26690 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
266a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
266b0 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
266c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
266d0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
266e0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
266f0 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
26700 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
26710 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
26720 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
26730 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
26740 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
26750 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
26760 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
26770 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  mp, apDiv[i], sz
26780 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
26790 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70  l[nCell] = pTemp
267a0 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b  +leafCorrection;
267b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
267c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
267d0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
267e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
267f0 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
26800 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
26810 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
26820 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
26830 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
26840 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  sz);.        szC
26850 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65  ell[nCell] -= le
26860 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
26870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65        assert( ge
26880 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70  t4byte(pTemp)==p
26890 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20  gnoOld[i] );.   
268a0 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
268b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
268c0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
268d0 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
268e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
268f0 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66  right pointer of
26900 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
26910 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65  pOld becomes the
26920 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20   left.          
26930 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
26940 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
26950 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
26960 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
26970 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70  , &pOld->aData[p
26980 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  Old->hdrOffset+8
26990 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], 4);.        }
269a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
269b0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
269c0 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
269d0 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
269e0 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
269f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
26a00 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
26a10 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
26a20 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
26a30 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
26a40 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
26a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26a60 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  }.        nCell+
26a70 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
26a80 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
26a90 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
26aa0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
26ab0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
26ac0 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
26ad0 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
26ae0 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
26af0 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
26b00 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
26b10 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
26b20 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
26b30 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
26b40 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
26b50 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
26b60 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
26b70 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
26b80 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
26b90 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
26ba0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
26bb0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
26bc0 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
26bd0 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
26be0 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
26bf0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
26c00 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
26c10 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
26c20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
26c30 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
26c40 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
26c50 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
26c60 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
26c70 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
26c80 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
26c90 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
26ca0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
26cb0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
26cc0 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
26cd0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
26ce0 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
26cf0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
26d00 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
26d10 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
26d20 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
26d30 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
26d40 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
26d50 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
26d60 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
26d70 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
26d80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
26d90 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
26da0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
26db0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
26dc0 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
26dd0 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
26de0 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
26df0 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
26e00 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
26e10 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
26e20 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
26e30 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
26e40 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
26e50 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
26e60 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
26e70 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
26e80 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
26e90 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
26ea0 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
26eb0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
26ec0 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
26ed0 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
26ee0 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
26ef0 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
26f00 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
26f10 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
26f20 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
26f30 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
26f40 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
26f50 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
26f60 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
26f70 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
26f80 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
26f90 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
26fa0 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
26fb0 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
26fc0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
26fd0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
26fe0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
26ff0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
27000 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
27010 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
27020 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
27030 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
27040 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
27050 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
27060 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
27070 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
27080 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
27090 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
270a0 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
270b0 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
270c0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
270d0 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
270e0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
270f0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
27100 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
27110 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
27120 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
27130 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
27140 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27160 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
27170 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
27180 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
27190 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
271a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
271b0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
271c0 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
271d0 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
271e0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
271f0 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
27200 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
27210 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
27220 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
27230 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
27240 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
27250 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
27260 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
27270 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
27280 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
27290 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
272a0 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
272b0 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
272c0 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
272d0 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
272e0 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
272f0 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
27300 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
27310 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
27320 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
27330 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
27340 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
27350 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
27360 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
27370 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
27380 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72  [0])>0) or we ar
27390 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72  e the.  ** a vir
273a0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
273b0 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
273c0 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
273d0 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
273e0 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
273f0 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
27400 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
27410 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
27420 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
27430 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
27440 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
27450 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
27460 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
27470 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
27480 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
27490 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
274a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
274b0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29   pPage->pgno>1 )
274c0 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20  ;.  pageFlags = 
274d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b  pPage->aData[0];
274e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
274f0 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
27500 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
27510 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
27520 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
27530 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
27540 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
27550 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20   pgnoOld[i];.   
27560 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
27570 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27580 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
27590 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
275a0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
275b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
275c0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
275d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
275e0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
275f0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
27600 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
27610 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
27620 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69  ew[i], pgnoNew[i
27630 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  -1], 0);.      i
27640 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
27650 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
27660 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70      apNew[i] = p
27670 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  New;.      nNew+
27680 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 65 72  +;.    }.    zer
27690 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
276a0 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
276b0 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
276c0 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
276d0 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
276e0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
276f0 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
27700 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
27710 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
27720 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
27730 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27740 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
27750 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
27760 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
27770 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
27780 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
27790 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
277a0 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
277b0 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
277c0 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
277d0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
277e0 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
277f0 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
27800 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
27810 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
27820 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
27830 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
27840 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
27850 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
27860 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
27870 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
27880 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
27890 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
278a0 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
278b0 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
278c0 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
278d0 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
278e0 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
278f0 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
27900 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
27910 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
27920 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
27930 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
27940 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
27950 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
27960 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
27970 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
27980 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
27990 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
279a0 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
279b0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
279c0 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
279d0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
279e0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
279f0 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
27a00 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c   if( pgnoNew[j]<
27a10 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
27a20 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
27a30 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
27a40 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20   = pgnoNew[j];. 
27a50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27a60 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
27a70 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20       int t;.    
27a80 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20    MemPage *pT;. 
27a90 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77       t = pgnoNew
27aa0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20  [i];.      pT = 
27ab0 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  apNew[i];.      
27ac0 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e  pgnoNew[i] = pgn
27ad0 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  oNew[minI];.    
27ae0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
27af0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
27b00 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20  pgnoNew[minI] = 
27b10 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  t;.      apNew[m
27b20 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
27b30 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
27b40 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
27b50 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25  %d %d  new: %d(%
27b60 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
27b70 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
27b80 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30  ",.    pgnoOld[0
27b90 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  ], .    nOld>=2 
27ba0 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30  ? pgnoOld[1] : 0
27bb0 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
27bc0 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a  pgnoOld[2] : 0,.
27bd0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20      pgnoNew[0], 
27be0 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
27bf0 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=2 ? pgnoNew[
27c00 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  1] : 0, nNew>=2 
27c10 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
27c20 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67      nNew>=3 ? pg
27c30 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e  noNew[2] : 0, nN
27c40 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
27c50 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
27c60 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a  4 ? pgnoNew[3] :
27c70 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a   0, nNew>=4 ? sz
27c80 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20  New[3] : 0,.    
27c90 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65  nNew>=5 ? pgnoNe
27ca0 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[4] : 0, nNew>=
27cb0 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
27cc0 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ));..  /*.  ** E
27cd0 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
27ce0 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
27cf0 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
27d00 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
27d10 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
27d20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
27d30 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
27d40 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
27d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
27d60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
27d70 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
27d80 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
27d90 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
27da0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
27db0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
27dc0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
27dd0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f  sert( pNew->pgno
27de0 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a  ==pgnoNew[i] );.
27df0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
27e00 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
27e10 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
27e20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
27e30 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
27e40 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
27e50 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
27e60 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
27e70 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
27e80 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  ow==0 );..#ifnde
27e90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27ea0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20  TOVACUUM.    /* 
27eb0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
27ec0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
27ed0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
27ee0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
27ef0 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70  es.    ** that p
27f00 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c  oint to the sibl
27f10 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72  ings that were r
27f20 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65  earranged. These
27f30 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20   can be: left.  
27f40 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66    ** children of
27f50 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68   cells, the righ
27f60 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70  t-child of the p
27f70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77  age, or overflow
27f80 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f   pages.    ** po
27f90 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c  inted to by cell
27fa0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
27fb0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
27fc0 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  m ){.      for(k
27fd0 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b  =j; k<cntNew[i];
27fe0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   k++){.        a
27ff0 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c  ssert( k<nMaxCel
28000 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ls );.        if
28010 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46  ( aFrom[k]==0xFF
28020 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
28030 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [k]]->pgno!=pNew
28040 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
28050 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
28060 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a  utOvfl(pNew, k-j
28070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
280a0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
280b0 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
280c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
280d0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
280e0 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
280f0 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
28100 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
28110 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
28120 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
28130 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
28140 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
28150 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
28160 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
28170 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28180 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e   i<nNew-1 && j<n
28190 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38  Cell ){.      u8
281a0 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75   *pCell;.      u
281b0 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
281c0 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61  int sz;..      a
281d0 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
281e0 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  ls );.      pCel
281f0 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20  l = apCell[j];. 
28200 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c       sz = szCell
28210 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63  [j] + leafCorrec
28220 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
28230 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
28240 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
28250 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
28260 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
28270 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
28280 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
28290 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
282a0 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
282b0 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
282c0 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
282d0 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
282e0 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
282f0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
28300 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
28310 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
28320 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
28330 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
28340 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
28350 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
28360 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
28370 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
28380 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
28390 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
283a0 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
283b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
283c0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
283d0 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
283e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
283f0 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
28400 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
28410 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
28420 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
28430 5d 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49  ];.        fillI
28440 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
28450 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
28460 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a  ey, 0, 0, 0, &sz
28470 29 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  );.        iSpac
28480 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
28490 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
284a0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
284b0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d   );.        pTem
284c0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
284d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
284e0 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
284f0 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b  pTemp = &aSpace[
28500 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20  iSpace];.       
28510 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20   iSpace += sz;. 
28520 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
28530 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65  Space<=pBt->page
28540 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20  Size*5 );.      
28550 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73    /* Obscure cas
28560 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64  e for non-leaf-d
28570 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68  ata trees: If th
28580 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20  e cell at pCell 
28590 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  was.        ** p
285a0 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64  reviously stored
285b0 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   on a leaf node,
285c0 20 61 6e 64 20 69 74 27 73 20 72 65 70 6f 72 74   and it's report
285d0 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
285e0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
285f0 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
28600 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
28610 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
28620 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74     ** (see sqlit
28630 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
28640 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69  Ptr(), 4 bytes i
28650 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  s the minimum si
28660 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ze of.        **
28670 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20   any cell). But 
28680 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
28690 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
286a0 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
286b0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
286c0 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
286d0 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
286e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
286f0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
28700 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
28710 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
28720 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
28730 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
28740 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
28750 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
28760 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
28770 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
28780 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
28790 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
287a0 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
287b0 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
287c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
287d0 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
287e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
287f0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
28800 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
28810 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
28820 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
28830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28840 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  }.      rc = ins
28850 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
28860 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
28870 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20  z, pTemp, 4);.  
28880 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28890 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
288a0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
288b0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
288c0 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
288d0 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e  arent,nxDiv), pN
288e0 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64  ew->pgno);.#ifnd
288f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
28900 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
28910 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
28920 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
28930 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61  abase, and not a
28940 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
28950 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75  .      ** then u
28960 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
28970 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e  r map with an en
28980 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
28990 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
289a0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c  ** that the cell
289b0 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70   just inserted p
289c0 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79  oints to (if any
289d0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
289e0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
289f0 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61  acuum && !leafDa
28a00 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ta ){.        rc
28a10 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
28a20 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
28a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28a40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28a50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
28a60 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
28a70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28a80 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b  .#endif.      j+
28a90 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
28aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
28ab0 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
28ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
28ad0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
28ae0 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
28af0 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
28b00 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
28b10 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
28b20 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
28b30 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  , &apCopy[nOld-1
28b40 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  ]->aData[8], 4);
28b50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
28b60 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
28b70 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  +pParent->nOverf
28b80 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69  low ){.    /* Ri
28b90 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
28ba0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
28bb0 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  st child of pPar
28bc0 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ent */.    put4b
28bd0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
28be0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
28bf0 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
28c00 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d  ew[nNew-1]);.  }
28c10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67  else{.    /* Rig
28c20 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
28c30 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c  is the left chil
28c40 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65  d of the first e
28c50 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a  ntry in pParent.
28c60 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
28c70 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64  right-most divid
28c80 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  er entry */.    
28c90 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
28ca0 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
28cb0 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e  t, nxDiv), pgnoN
28cc0 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d  ew[nNew-1]);.  }
28cd0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61  ..  /*.  ** Repa
28ce0 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66  rent children of
28cf0 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   all cells..  */
28d00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
28d10 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  ew; i++){.    rc
28d20 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64   = reparentChild
28d30 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b  Pages(apNew[i]);
28d40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
28d50 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
28d60 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
28d70 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65   }.  rc = repare
28d80 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61  ntChildPages(pPa
28d90 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
28da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
28db0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28dc0 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61  p;..  /*.  ** Ba
28dd0 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
28de0 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61   page.  Note tha
28df0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
28e00 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74  ge (pPage) might
28e10 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
28e20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
28e30 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68  elist so it migh
28e40 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69  t no longer be i
28e50 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
28e60 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20   But the parent 
28e70 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  page will always
28e80 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
28e90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28ea0 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
28eb0 29 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  );.  rc = balanc
28ec0 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  e(pParent, 0);. 
28ed0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61   .  /*.  ** Clea
28ee0 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
28ef0 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
28f00 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
28f10 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c  lite3_free(apCel
28f20 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
28f30 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
28f40 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
28f50 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
28f60 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
28f70 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
28f80 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
28f90 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
28fa0 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52  e(pParent);.  TR
28fb0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66  ACE(("BALANCE: f
28fc0 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a  inished with %d:
28fd0 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63   old=%d new=%d c
28fe0 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  ells=%d\n",.    
28ff0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
29000 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e  o, nOld, nNew, n
29010 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  Cell));.  return
29020 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
29030 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
29040 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  lled for the roo
29050 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65  t page of a btre
29060 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a  e when the root.
29070 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
29080 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73   no cells.  This
29090 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   is an opportuni
290a0 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ty to make the t
290b0 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72  ree.** shallower
290c0 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a   by one level..*
290d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
290e0 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d  ance_shallower(M
290f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
29100 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
29110 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
29120 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  * The only child
29130 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a   page of pPage *
29140 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
29150 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
29160 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
29170 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20  for pChild */.  
29180 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29190 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
291a0 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
291b0 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
291c0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
291d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
291e0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
291f0 42 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20  BTree structure 
29200 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50  */.  int mxCellP
29210 65 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  erPage;         
29220 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
29230 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72  ber of cells per
29240 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
29250 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
29260 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
29270 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20  ells from pages 
29280 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a  being balanced *
29290 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b  /.  int *szCell;
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
292c0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a  f all cells */..
292d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
292e0 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20  >pParent==0 );. 
292f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29300 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
29310 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
29320 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67  eeMutexHeld(pPag
29330 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
29340 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
29350 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65  >pBt;.  mxCellPe
29360 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28  rPage = MX_CELL(
29370 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d  pBt);.  apCell =
29380 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
29390 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28   mxCellPerPage*(
293a0 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65  sizeof(u8*)+size
293b0 6f 66 28 69 6e 74 29 29 20 29 3b 0a 20 20 69 66  of(int)) );.  if
293c0 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65  ( apCell==0 ) re
293d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
293e0 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69  M;.  szCell = (i
293f0 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65  nt*)&apCell[mxCe
29400 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66  llPerPage];.  if
29410 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
29420 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
29430 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
29440 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41  empty */.    TRA
29450 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d  CE(("BALANCE: em
29460 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c  pty table %d\n",
29470 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
29480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
29490 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
294a0 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f   empty but has o
294b0 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73  ne child.  Trans
294c0 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69  fer the.    ** i
294d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
294e0 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69  that one child i
294f0 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67  nto the root pag
29500 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20  e if it .    ** 
29510 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20  will fit.  This 
29520 72 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74  reduces the dept
29530 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79  h of the tree by
29540 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
29550 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
29560 70 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20  page is page 1, 
29570 69 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63  it has less spac
29580 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e  e available than
29590 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c  .    ** its chil
295a0 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30  d (due to the 10
295b0 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68  0 byte header th
295c0 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
295d0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a   beginning.    *
295e0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
295f0 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69  e fle), so it mi
29600 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ght not be able 
29610 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74  to hold all of t
29620 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  he .    ** infor
29630 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  mation currently
29640 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
29650 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69  e child.  If thi
29660 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  s is the .    **
29670 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e   case, then do n
29680 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66  ot do the transf
29690 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20  er.  Leave page 
296a0 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20  1 empty except. 
296b0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69     ** for the ri
296c0 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74  ght-pointer to t
296d0 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  he child page.  
296e0 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62  The child page b
296f0 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68  ecomes.    ** th
29700 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f  e virtual root o
29710 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20  f the tree..    
29720 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  */.    pgnoChild
29730 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
29740 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
29750 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
29760 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
29770 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61  Child>0 );.    a
29780 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
29790 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  <=sqlite3PagerPa
297a0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  gecount(pPage->p
297b0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20  Bt->pPager) );. 
297c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
297d0 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67  treeGetPage(pPag
297e0 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  e->pBt, pgnoChil
297f0 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a  d, &pChild, 0);.
29800 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
29810 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
29820 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70  lance;.    if( p
29830 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  Page->pgno==1 ){
29840 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29850 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
29860 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b  (pChild, pPage);
29870 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
29880 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
29890 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
298a0 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
298b0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
298c0 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64        if( pChild
298d0 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a  ->nFree>=100 ){.
298e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
298f0 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hild information
29900 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
29910 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64   root page, so d
29920 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
29930 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20   copy */.       
29940 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
29950 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
29960 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
29970 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
29980 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43  =0; i<pChild->nC
29990 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
299a0 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d       apCell[i] =
299b0 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64   findCell(pChild
299c0 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ,i);.          s
299d0 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53  zCell[i] = cellS
299e0 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61  izePtr(pChild, a
299f0 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  pCell[i]);.     
29a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
29a10 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c  emblePage(pPage,
29a20 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20   pChild->nCell, 
29a30 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b  apCell, szCell);
29a40 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
29a50 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
29a60 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
29a70 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
29a80 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  /.        put4by
29a90 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
29aa0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29ab0 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  t+8], .         
29ac0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43 68     get4byte(&pCh
29ad0 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c  ild->aData[pChil
29ae0 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  d->hdrOffset+8])
29af0 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  );.        freeP
29b00 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
29b10 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
29b20 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74  ANCE: child %d t
29b30 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20  ransfer to page 
29b40 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
29b50 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  no));.      }els
29b60 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
29b70 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65  e child has more
29b80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
29b90 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
29ba0 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20  e root..        
29bb0 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61  ** The tree is a
29bc0 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e  lready balanced.
29bd0 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f    Do nothing. */
29be0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
29bf0 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20  "BALANCE: child 
29c00 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  %d will not fit 
29c10 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  on page 1\n", pC
29c20 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
29c30 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
29c40 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
29c50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69  age->aData, pChi
29c60 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65  ld->aData, pPage
29c70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
29c80 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  e);.      pPage-
29c90 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
29ca0 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
29cb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
29cc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
29cd0 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
29ce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
29d00 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28  .      freePage(
29d10 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54  pChild);.      T
29d20 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
29d30 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25  transfer child %
29d40 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e  d into root %d\n
29d50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29d60 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70   pChild->pgno, p
29d70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
29d80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70    }.    rc = rep
29d90 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
29da0 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65  pPage);.    asse
29db0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
29dc0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  flow==0 );.#ifnd
29dd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29de0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
29df0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
29e00 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  m ){.      int i
29e10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29e20 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
29e30 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20   i++){ .        
29e40 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
29e50 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  fl(pPage, i);.  
29e60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29e80 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68       goto end_sh
29e90 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
29ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29eb0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
29ec0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
29ed0 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73  hild);.  }.end_s
29ee0 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a  hallow_balance:.
29ef0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
29f00 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pCell);.  return
29f10 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
29f20 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
29f30 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57  overfull.**.** W
29f40 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73  hen this happens
29f50 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  , Create a new c
29f60 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f  hild page and co
29f70 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  py the.** conten
29f80 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69  ts of the root i
29f90 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20  nto the child.  
29fa0 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f  Then make the ro
29fb0 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d  ot.** page an em
29fc0 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69  pty page with ri
29fd0 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e  ghtChild pointin
29fe0 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  g to the new.** 
29ff0 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79  child.   Finally
2a000 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69  , call balance_i
2a010 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65  nternal() on the
2a020 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f   new child.** to
2a030 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c   cause it to spl
2a040 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
2a050 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
2a060 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
2a070 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2a080 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2a090 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
2a0a0 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
2a0b0 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
2a0c0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2a0d0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
2a0e0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
2a0f0 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50  oChild;     /* P
2a100 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2a110 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
2a120 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
2a130 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt;         /* 
2a140 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69  The BTree */.  i
2a150 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
2a160 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62     /* Total usab
2a170 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67  le size of a pag
2a180 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  e */.  u8 *data;
2a190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2a1a0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72  ntent of the par
2a1b0 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ent page */.  u8
2a1c0 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20   *cdata;        
2a1d0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2a1e0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a  the child page *
2a1f0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2a200 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2a210 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72  t to page header
2a220 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20   in parent */.  
2a230 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20  int brk;        
2a240 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2a250 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73   content of firs
2a260 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74  t cell in parent
2a270 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2a280 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Page->pParent==0
2a290 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2a2a0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2a2b0 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
2a2c0 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
2a2d0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
2a2e0 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74  texHeld(pBt->mut
2a2f0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c  ex) );.  rc = al
2a300 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2a310 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70  pBt, &pChild, &p
2a320 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d  gnoChild, pPage-
2a330 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28  >pgno, 0);.  if(
2a340 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a350 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a360 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2a370 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
2a380 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ge) );.  usableS
2a390 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
2a3a0 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20  eSize;.  data = 
2a3b0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2a3c0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2a3d0 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20  Offset;.  brk = 
2a3e0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2a3f0 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20  dr+5]);.  cdata 
2a400 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b  = pChild->aData;
2a410 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c  .  memcpy(cdata,
2a420 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61   &data[hdr], pPa
2a430 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
2a440 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64  *pPage->nCell-hd
2a450 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64  r);.  memcpy(&cd
2a460 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b  ata[brk], &data[
2a470 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
2a480 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  -brk);.  assert(
2a490 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d   pChild->isInit=
2a4a0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
2a4b0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2a4c0 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
2a4d0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2a4e0 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
2a4f0 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43  out;.  memcpy(pC
2a500 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61  hild->aOvfl, pPa
2a510 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ge->aOvfl, pPage
2a520 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2a530 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2a540 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
2a550 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
2a560 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
2a570 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
2a580 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68  rflow ){.    pCh
2a590 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  ild->nFree = 0;.
2a5a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2a5b0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
2a5c0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a  ge->nCell );.  z
2a5d0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2a5e0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
2a5f0 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
2a600 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2a610 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2a620 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2a630 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28  Child);.  TRACE(
2a640 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
2a650 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
2a660 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2a670 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2a680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a690 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2a6a0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2a6b0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74  acuum ){.    int
2a6c0 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   i;.    rc = ptr
2a6d0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69  mapPut(pBt, pChi
2a6e0 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ld->pgno, PTRMAP
2a6f0 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70  _BTREE, pPage->p
2a700 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
2a710 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
2a720 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66  eeper_out;.    f
2a730 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
2a740 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2a750 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2a760 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20  PutOvfl(pChild, 
2a770 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  i);.      if( rc
2a780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a790 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2a7a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a7b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20    }.#endif.  rc 
2a7c0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2a7d0 74 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61  t(pChild);..bala
2a7e0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20  ncedeeper_out:. 
2a7f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2a800 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ild);.  return r
2a810 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69  c;.}../*.** Deci
2a820 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70  de if the page p
2a830 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  Page needs to be
2a840 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62   balanced.  If b
2a850 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72  alancing is.** r
2a860 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68  equired, call th
2a870 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
2a880 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e  lancing routine.
2a890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2a8a0 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a  alance(MemPage *
2a8b0 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72  pPage, int inser
2a8c0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2a8d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2a8e0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2a8f0 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d  MutexHeld(pPage-
2a900 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2a910 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
2a920 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rent==0 ){.    r
2a930 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a940 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2a950 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2a960 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a970 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a980 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
2a990 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
2a9a0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2a9b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a9c0 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  _OK && pPage->nC
2a9d0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
2a9e0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61  rc = balance_sha
2a9f0 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a 20  llower(pPage);. 
2aa00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2aa10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2aa20 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20  erflow>0 || .   
2aa30 20 20 20 20 20 28 21 69 6e 73 65 72 74 20 26 26       (!insert &&
2aa40 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50   pPage->nFree>pP
2aa50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2aa60 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20  Size*2/3) ){.   
2aa70 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2aa80 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a  nonroot(pPage);.
2aa90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2aaa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2aab0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
2aac0 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  cks all cursors 
2aad0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61  that point to ta
2aae0 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  ble pgnoRoot..**
2aaf0 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   If any of those
2ab00 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70   cursors were op
2ab10 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
2ab20 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72 65  ==0 in a differe
2ab30 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  nt.** database c
2ab40 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74  onnection (a dat
2ab50 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2ab60 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68 65   that shares the
2ab70 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20   pager.** cache 
2ab80 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
2ab90 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64   connection) and
2aba0 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e   that other conn
2abb0 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f  ection .** is no
2abc0 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63  t in the ReadUnc
2abd0 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c  ommmitted state,
2abe0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2abf0 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  ne returns .** S
2ac00 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a  QLITE_LOCKED..**
2ac10 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  .** In addition 
2ac20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  to checking for 
2ac30 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65 72  read-locks (wher
2ac40 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a  e a read-lock .*
2ac50 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f 72  * means a cursor
2ac60 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
2ac70 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f 75  lag==0) this rou
2ac80 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73 0a  tine also moves.
2ac90 2a 2a 20 61 6c 6c 20 77 72 69 74 65 20 63 75 72  ** all write cur
2aca0 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  sors so that the
2acb0 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74  y are pointing t
2acc0 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  o the .** first 
2acd0 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f 74  Cell on the root
2ace0 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
2acf0 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
2ad00 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20  e an insert .** 
2ad10 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20  or delete might 
2ad20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65  change the numbe
2ad30 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20  r of cells on a 
2ad40 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a  page or delete.*
2ad50 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c  * a page entirel
2ad60 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20  y and we do not 
2ad70 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e  want to leave an
2ad80 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f  y cursors .** po
2ad90 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78  inting to non-ex
2ada0 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20  istant pages or 
2adb0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
2adc0 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
2add0 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cks(Btree *pBtre
2ade0 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  e, Pgno pgnoRoot
2adf0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
2ae00 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  lude){.  BtCurso
2ae10 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
2ae20 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
2ae30 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
2ae40 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 70 53 71  db = pBtree->pSq
2ae50 6c 69 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  lite;.  assert( 
2ae60 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
2ae70 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  xHeld(pBt->mutex
2ae80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2ae90 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
2aea0 48 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  Held(db->mutex) 
2aeb0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2aec0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2aed0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2aee0 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
2aef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2af00 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
2af10 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
2af20 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2af30 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f  pgnoRoot!=pgnoRo
2af40 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ot ) continue;. 
2af50 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
2af60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2af70 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20  ite3 *dbOther = 
2af80 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  p->pBtree->pSqli
2af90 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  te;.      if( db
2afa0 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20  Other==0 ||.    
2afb0 20 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64       (dbOther!=d
2afc0 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66  b && (dbOther->f
2afd0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
2afe0 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d  adUncommitted)==
2aff0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0) ){.        re
2b000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2b010 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
2b020 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 50 61  }else if( p->pPa
2b030 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e  ge->pgno!=p->pgn
2b040 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d  oRoot ){.      m
2b050 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20  oveToRoot(p);.  
2b060 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2b070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2b080 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
2b090 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
2b0a0 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
2b0b0 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
2b0c0 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
2b0d0 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
2b0e0 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
2b0f0 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
2b100 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
2b110 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
2b120 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
2b130 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
2b140 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
2b150 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2b160 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2b170 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2b180 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
2b190 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
2b1a0 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
2b1b0 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
2b1c0 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
2b1d0 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
2b1e0 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
2b1f0 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
2b200 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
2b210 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2b220 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
2b230 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2b240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b250 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
2b260 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
2b270 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
2b280 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2b290 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2b2a0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
2b2b0 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
2b2c0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2b2d0 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
2b2e0 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
2b2f0 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2b300 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b320 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b330 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
2b340 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
2b350 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
2b360 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20  dBias           
2b370 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2b380 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
2b390 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a  an append */.){.
2b3a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2b3b0 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77  loc;.  int szNew
2b3c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2b3d0 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  ge;.  Btree *p =
2b3e0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
2b3f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2b400 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
2b410 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c  ned char *oldCel
2b420 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
2b430 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b  ar *newCell = 0;
2b440 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
2b450 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
2b460 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2b470 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2b480 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2b490 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2b4a0 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
2b4b0 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  an insert */.   
2b4c0 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
2b4d0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2b4e0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2b4f0 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
2b500 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2b510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b520 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2b530 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2b540 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2b550 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
2b560 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2b570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b580 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72  E_PERM;   /* Cur
2b590 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72  sor not open for
2b5a0 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
2b5b0 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
2b5c0 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
2b5d0 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
2b5e0 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20  t, pCur) ){.    
2b5f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2b600 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
2b610 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
2b620 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
2b630 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
2b640 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
2b650 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
2b660 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2b670 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2b680 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
2b690 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75  ble */.  clearCu
2b6a0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2b6b0 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53  r);.  if( .    S
2b6c0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2b6d0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2b6e0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2b6f0 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20  ot, pCur)) ||.  
2b700 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
2b710 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2b720 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
2b730 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
2b740 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a  as, &loc)).  ){.
2b750 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2b760 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
2b770 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2b780 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2b790 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
2b7a0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  Page->intKey || 
2b7b0 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
2b7c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2b7d0 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   || !pPage->leaf
2b7e0 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28  Data );.  TRACE(
2b7f0 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
2b800 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
2b810 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
2b820 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
2b830 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
2b840 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
2b850 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
2b860 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
2b870 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
2b880 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
2b890 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2b8a0 20 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20   );.  newCell = 
2b8b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
2b8c0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2b8d0 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 43 65  ) );.  if( newCe
2b8e0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
2b8f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
2b900 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  c = fillInCell(p
2b910 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70  Page, newCell, p
2b920 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61  Key, nKey, pData
2b930 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20  , nData, nZero, 
2b940 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  &szNew);.  if( r
2b950 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2b960 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ert;.  assert( s
2b970 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  zNew==cellSizePt
2b980 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  r(pPage, newCell
2b990 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2b9a0 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49  zNew<=MX_CELL_SI
2b9b0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28  ZE(pBt) );.  if(
2b9c0 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f   loc==0 && CURSO
2b9d0 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
2b9e0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74  State ){.    int
2b9f0 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
2ba00 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
2ba10 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
2ba20 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2ba30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ba40 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2ba50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2ba60 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
2ba70 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2ba80 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c     }.    oldCell
2ba90 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2baa0 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20  e, pCur->idx);. 
2bab0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2bac0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  eaf ){.      mem
2bad0 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64  cpy(newCell, old
2bae0 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a  Cell, 4);.    }.
2baf0 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c      szOld = cell
2bb00 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f  SizePtr(pPage, o
2bb10 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20  ldCell);.    rc 
2bb20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
2bb30 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
2bb40 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2bb50 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64  nd_insert;.    d
2bb60 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2bb70 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29  Cur->idx, szOld)
2bb80 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  ;.  }else if( lo
2bb90 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  c<0 && pPage->nC
2bba0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ell>0 ){.    ass
2bbb0 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2bbc0 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64   );.    pCur->id
2bbd0 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x++;.    pCur->i
2bbe0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2bbf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2bc00 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2bc10 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e  );.  }.  rc = in
2bc20 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20  sertCell(pPage, 
2bc30 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65  pCur->idx, newCe
2bc40 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29  ll, szNew, 0, 0)
2bc50 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2bc60 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
2bc70 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20  _insert;.  rc = 
2bc80 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31  balance(pPage, 1
2bc90 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42  );.  /* sqlite3B
2bca0 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 43 75  treePageDump(pCu
2bcb0 72 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  r->pBt, pCur->pg
2bcc0 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20  noRoot, 1); */. 
2bcd0 20 2f 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75   /* fflush(stdou
2bce0 74 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  t); */.  if( rc=
2bcf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bd00 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
2bd10 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65  r);.  }.end_inse
2bd20 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  rt:.  sqlite3_fr
2bd30 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 73  ee(newCell);.  s
2bd40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2bd50 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2bd60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2bd70 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
2bd80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
2bd90 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
2bda0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2bdb0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2bdc0 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2bdd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2bde0 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
2bdf0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2be00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2be10 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75  pCur->pPage;.  u
2be20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2be30 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ell;.  int rc;. 
2be40 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20   Pgno pgnoChild 
2be50 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  = 0;.  Btree *p 
2be60 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
2be70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2be80 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
2be90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
2bea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2beb0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2bec0 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2bed0 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2bee0 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2bef0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2bf00 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
2bf10 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a  ing a delete */.
2bf20 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2bf30 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2bf40 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2bf50 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
2bf60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2bf70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2bf80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2bf90 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2bfa0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64  ;.  if( pCur->id
2bfb0 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  x >= pPage->nCel
2bfc0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
2bfd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2bfe0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bff0 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20  _ERROR;  /* The 
2c000 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
2c010 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69  inting to anythi
2c020 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2c030 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
2c040 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
2c050 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
2c060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2c070 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20  M;   /* Did not 
2c080 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72  open this cursor
2c090 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a   for writing */.
2c0a0 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52    }.  if( checkR
2c0b0 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70  eadLocks(pCur->p
2c0c0 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e  Btree, pCur->pgn
2c0d0 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a  oRoot, pCur) ){.
2c0e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2c0f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
2c100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2c110 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
2c120 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
2c130 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
2c140 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  */.  }..  /* Res
2c150 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
2c160 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2c170 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
2c180 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
2c190 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
2c1a0 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2c1b0 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
2c1c0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2c1d0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
2c1e0 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
2c1f0 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
2c200 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2c210 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
2c220 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
2c230 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
2c240 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
2c250 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
2c260 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43  (rc = restoreOrC
2c270 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2c280 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  on(pCur))!=0 ||.
2c290 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c      (rc = saveAl
2c2a0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2c2b0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2c2c0 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2c2d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c2e0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2c2f0 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a  bPage))!=0.  ){.
2c300 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2c310 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
2c320 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2c330 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65  /* Locate the ce
2c340 6c 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70  ll within it's p
2c350 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
2c360 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
2c370 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
2c380 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
2c390 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
2c3a0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2c3b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2c3c0 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
2c3d0 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
2c3e0 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
2c3f0 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  /.  pCell = find
2c400 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c410 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  ->idx);.  if( !p
2c420 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2c430 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2c440 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2c450 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
2c460 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2c470 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2c480 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
2c490 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
2c4a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
2c4b0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2c4c0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2c4d0 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72   The entry we ar
2c4e0 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
2c4f0 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
2c500 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a  so if we do not.
2c510 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68      ** do someth
2c520 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  ing we will leav
2c530 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69  e a hole on an i
2c540 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20  nternal page..  
2c550 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
2c560 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79  fill the hole by
2c570 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c   moving in a cel
2c580 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20  l from a leaf.  
2c590 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  The.    ** next 
2c5a0 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f  Cell after the o
2c5b0 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ne to be deleted
2c5c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2c5d0 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20  o exist and.    
2c5e0 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20  ** to be a leaf 
2c5f0 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  so we can use it
2c600 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43  ..    */.    BtC
2c610 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20  ursor leafCur;. 
2c620 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2c630 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
2c640 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65   szNext;  /* The
2c650 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
2c660 67 20 69 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65  g is wrong: szNe
2c670 78 74 20 69 73 20 61 6c 77 61 79 73 20 0a 20 20  xt is always .  
2c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2c690 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65  * initialized be
2c6a0 66 6f 72 65 20 75 73 65 2e 20 20 41 64 64 69 6e  fore use.  Addin
2c6b0 67 20 61 6e 20 65 78 74 72 61 20 69 6e 69 74 69  g an extra initi
2c6c0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20  alization.      
2c6d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
2c6e0 20 73 69 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d   silence the com
2c6f0 70 69 6c 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e  piler slows down
2c700 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20   the code. */.  
2c710 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
2c720 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2c730 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a   *tempCell = 0;.
2c740 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2c750 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a  ge->leafData );.
2c760 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2c770 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43  GetTempCursor(pC
2c780 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20  ur, &leafCur);. 
2c790 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2c7a0 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
2c7b0 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
2c7c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2c7e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c7f0 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ite(leafCur.pPag
2c800 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2c810 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2c820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c830 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
2c840 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
2c850 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20  e internal from 
2c860 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20  %d replace from 
2c870 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2c880 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2c890 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2c8a0 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  , leafCur.pPage-
2c8b0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64  >pgno));.      d
2c8c0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2c8d0 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2c8e0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2c8f0 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
2c900 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61  t = findCell(lea
2c910 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
2c920 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20  Cur.idx);.      
2c930 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a  szNext = cellSiz
2c940 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61  ePtr(leafCur.pPa
2c950 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20  ge, pNext);.    
2c960 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
2c970 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e  L_SIZE(pBt)>=szN
2c980 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 74  ext+4 );.      t
2c990 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65  empCell = sqlite
2c9a0 33 5f 6d 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c  3_malloc( MX_CEL
2c9b0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
2c9c0 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c       if( tempCel
2c9d0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
2c9e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2c9f0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
2ca00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2ca10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ca20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2ca30 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2ca40 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78  , pNext-4, szNex
2ca50 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30  t+4, tempCell, 0
2ca60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2ca70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ca80 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2ca90 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2caa0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2cab0 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  dx), pgnoChild);
2cac0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2cad0 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  nce(pPage, 0);. 
2cae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2caf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cb00 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61      dropCell(lea
2cb10 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
2cb20 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29  Cur.idx, szNext)
2cb30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  ;.      rc = bal
2cb40 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61  ance(leafCur.pPa
2cb50 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ge, 0);.    }.  
2cb60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 74    sqlite3_free(t
2cb70 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 73 71  empCell);.    sq
2cb80 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
2cb90 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61  eTempCursor(&lea
2cba0 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fCur);.  }else{.
2cbb0 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
2cbc0 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
2cbd0 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ete from leaf %d
2cbe0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72  \n",.       pCur
2cbf0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2cc00 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64  e->pgno));.    d
2cc10 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2cc20 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2cc30 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2cc40 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  ll));.    rc = b
2cc50 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
2cc60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2cc70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cc80 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2cc90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2cca0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2ccb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ccc0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2ccd0 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2cce0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2ccf0 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2cd00 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2cd10 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2cd20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2cd30 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2cd40 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2cd50 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2cd60 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2cd70 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2cd80 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2cd90 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2cda0 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2cdb0 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2cdc0 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2cdd0 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2cde0 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2cdf0 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2ce00 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2ce10 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2ce20 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2ce30 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2ce40 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2ce50 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61  L indices.*/.sta
2ce60 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65  tic int btreeCre
2ce70 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2ce80 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2ce90 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2cea0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2ceb0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2cec0 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2ced0 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2cee0 72 63 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  rc;..  if( pBt->
2cef0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2cf00 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2cf10 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2cf20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  a transaction fi
2cf30 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  rst */.    rc = 
2cf40 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2cf50 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2cf60 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2cf70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2cf80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2cf90 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
2cfa0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2cfb0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2cfc0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2cfd0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
2cfe0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
2cff0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2d000 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2d010 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
2d020 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2d030 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2d040 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
2d050 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
2d060 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
2d070 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
2d080 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
2d090 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
2d0a0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2d0b0 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65  . */..    /* Cre
2d0c0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
2d0d0 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72  e may probably r
2d0e0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
2d0f0 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
2d100 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  se.    ** to mak
2d110 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
2d120 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70  ew tables root p
2d130 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69  age. In case thi
2d140 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20  s page turns.   
2d150 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e   ** out to be an
2d160 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
2d170 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66  delete all overf
2d180 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63  low page-map cac
2d190 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20  hes.    ** held 
2d1a0 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  by open cursors.
2d1b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61  .    */.    inva
2d1c0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
2d1d0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20  wCache(pBt);..  
2d1e0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
2d1f0 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66  lue of meta[3] f
2d200 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2d210 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2d220 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ere the.    ** r
2d230 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2d240 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  new table should
2d250 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20   go. meta[3] is 
2d260 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2d270 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65  -page.    ** cre
2d280 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20  ated so far, so 
2d290 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2d2a0 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29  e is (meta[3]+1)
2d2b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2d2c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2d2d0 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e  tMeta(p, 4, &pgn
2d2e0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
2d2f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d300 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2d310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f  ;.    }.    pgno
2d320 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Root++;..    /* 
2d330 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  The new root-pag
2d340 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c  e may not be all
2d350 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e  ocated on a poin
2d360 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72  ter-map page, or
2d370 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44   the.    ** PEND
2d380 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20  ING_BYTE page.. 
2d390 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
2d3a0 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50  noRoot==PTRMAP_P
2d3b0 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52  AGENO(pBt, pgnoR
2d3c0 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  oot) ||.        
2d3d0 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e  pgnoRoot==PENDIN
2d3e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2d3f0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f   ){.      pgnoRo
2d400 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ot++;.    }.    
2d410 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74  assert( pgnoRoot
2d420 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  >=3 );..    /* A
2d430 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20  llocate a page. 
2d440 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75  The page that cu
2d450 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20  rrently resides 
2d460 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c  at pgnoRoot will
2d470 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64  .    ** be moved
2d480 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2d490 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74  d page (unless t
2d4a0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2d4b0 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a  e happens.    **
2d4c0 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67   to reside at pg
2d4d0 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a  noRoot)..    */.
2d4e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2d4f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2d500 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e  &pPageMove, &pgn
2d510 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c  oMove, pgnoRoot,
2d520 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   1);.    if( rc!
2d530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d540 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d550 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67     }..    if( pg
2d560 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74  noMove!=pgnoRoot
2d570 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e   ){.      /* pgn
2d580 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67  oRoot is the pag
2d590 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  e that will be u
2d5a0 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  sed for the root
2d5b0 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a  -page of.      *
2d5c0 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
2d5d0 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72  (assuming an err
2d5e0 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72  or did not occur
2d5f0 29 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20  ). But we were. 
2d600 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2d610 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72  d pgnoMove. If r
2d620 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66  equired (i.e. if
2d630 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f   it was not allo
2d640 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  cated.      ** b
2d650 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20  y extending the 
2d660 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65  file), the curre
2d670 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74  nt page at posit
2d680 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20  ion pgnoMove.   
2d690 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
2d6a0 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20   journaled..    
2d6b0 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54    */.      u8 eT
2d6c0 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ype;.      Pgno 
2d6d0 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20  iPtrPage;..     
2d6e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2d6f0 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20  geMove);..      
2d700 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  /* Move the page
2d710 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67   currently at pg
2d720 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f  noRoot to pgnoMo
2d730 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ve. */.      rc 
2d740 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2d750 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2d760 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
2d770 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2d780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d790 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d7a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2d7b0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2d7c0 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70   pgnoRoot, &eTyp
2d7d0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
2d7e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d7f0 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d  ITE_OK || eType=
2d800 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
2d810 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2d820 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
2d830 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d840 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2d850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d860 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2d870 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
2d880 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20  _ROOTPAGE );.   
2d890 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2d8a0 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  !=PTRMAP_FREEPAG
2d8b0 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
2d8c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d8d0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2d8e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d8f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d900 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d910 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2d920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d930 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2d940 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2d950 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20  , pRoot, eType, 
2d960 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f  iPtrPage, pgnoMo
2d970 76 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ve);.      relea
2d980 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a  sePage(pRoot);..
2d990 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
2d9a0 74 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f  the page at pgno
2d9b0 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  Root */.      if
2d9c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d9d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2d9e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2d9f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2da00 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
2da10 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
2da20 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
2da30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2da40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2da50 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2da60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2da70 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
2da80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2da90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2daa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2dab0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2dac0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2dad0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2dae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2daf0 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65  Root = pPageMove
2db00 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a  ;.    } ..    /*
2db10 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   Update the poin
2db20 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61  ter-map and meta
2db30 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e  -data with the n
2db40 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  ew root-page num
2db50 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ber. */.    rc =
2db60 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2db70 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50  pgnoRoot, PTRMAP
2db80 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20  _ROOTPAGE, 0);. 
2db90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2dba0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2dbb0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
2dbc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2dbd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2dbe0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
2dbf0 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20   4, pgnoRoot);. 
2dc00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2dc10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2dc20 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
2dc30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2dc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2dc50 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2dc60 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2dc70 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2dc80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2dc90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2dca0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73  ndif.  assert( s
2dcb0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2dcc0 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
2dcd0 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f  bPage) );.  zero
2dce0 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67  Page(pRoot, flag
2dcf0 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  s | PTF_LEAF);. 
2dd00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2dd10 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  ef(pRoot->pDbPag
2dd20 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d  e);.  *piTable =
2dd30 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a   (int)pgnoRoot;.
2dd40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2dd50 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
2dd60 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
2dd70 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2dd80 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
2dd90 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
2dda0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2ddb0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
2ddc0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
2ddd0 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67  p, piTable, flag
2dde0 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
2ddf0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
2de00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2de10 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
2de20 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
2de30 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
2de40 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
2de50 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
2de60 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
2de70 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
2de80 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74  tabasePage(.  Bt
2de90 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2dea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2deb0 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ree that contain
2dec0 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
2ded0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
2dee0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2def0 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a  umber to clear *
2df00 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2df10 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
2df20 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20  ent page.  NULL 
2df30 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a  for the root */.
2df40 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
2df50 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag      /* Deall
2df60 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
2df70 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ue */.){.  MemPa
2df80 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
2df90 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
2dfa0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2dfb0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
2dfc0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
2dfd0 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d 3e  eMutexHeld(pBt->
2dfe0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2dff0 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  pgno>sqlite3Page
2e000 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
2e010 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
2e020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2e030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
2e040 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2e050 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
2e060 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74   &pPage, pParent
2e070 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2e080 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2e090 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
2e0a0 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
2e0b0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
2e0c0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2e0d0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
2e0e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2e0f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
2e100 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2e110 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2e120 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61  ell), pPage->pPa
2e130 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rent, 1);.      
2e140 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2e150 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2e160 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
2e170 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2e180 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2e190 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2e1a0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e1b0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
2e1c0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e1d0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2e1e0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2e1f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2e200 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67  >aData[8]), pPag
2e210 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2e220 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2e230 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2e240 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69  age_out;.  }.  i
2e250 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  f( freePageFlag 
2e260 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
2e270 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
2e280 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
2e290 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e2a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e2b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f  )==0 ){.    zero
2e2c0 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
2e2d0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
2e2e0 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
2e2f0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2e300 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
2e310 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
2e320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e330 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
2e340 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
2e350 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
2e360 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
2e370 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
2e380 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2e390 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2e3a0 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
2e3b0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2e3c0 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
2e3d0 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
2e3e0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
2e3f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e400 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2e410 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2e420 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2e430 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
2e440 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
2e450 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
2e460 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
2e470 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
2e480 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  of the table..*/
2e490 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e4a0 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
2e4b0 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2e4c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
2e4d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2e4e0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
2e4f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
2e500 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2e510 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2e520 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2e530 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2e540 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2e550 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
2e560 20 69 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b   if( (rc = check
2e570 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61  ReadLocks(p, iTa
2e580 62 6c 65 2c 20 30 29 29 21 3d 53 51 4c 49 54 45  ble, 0))!=SQLITE
2e590 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  _OK ){.    /* no
2e5a0 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
2e5b0 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
2e5c0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
2e5d0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2e5e0 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20  iTable, 0)) ){. 
2e5f0 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
2e600 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
2e610 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2e620 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2e630 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
2e640 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
2e650 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2e660 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e670 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
2e680 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
2e690 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20  a table and add 
2e6a0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2e6b0 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20  table to.** the 
2e6c0 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70  freelist.  Excep
2e6d0 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  t, the root of t
2e6e0 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62  he principle tab
2e6f0 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a  le (the one on.*
2e700 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76  * page 1) is nev
2e710 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  er added to the 
2e720 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
2e730 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2e740 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
2e750 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
2e760 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
2e770 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ** cursors on th
2e780 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
2e790 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
2e7a0 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  enabled and the 
2e7b0 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69  page at iTable i
2e7c0 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a  s not the last.*
2e7d0 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  * root page in t
2e7e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e7f0 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
2e800 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e  root page .** in
2e810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e820 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f  le is moved into
2e830 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72   the slot former
2e840 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a  ly occupied by.*
2e850 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61  * iTable and tha
2e860 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d  t last slot form
2e870 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
2e880 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
2e890 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  age.** is added 
2e8a0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
2e8b0 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c  instead of iTabl
2e8c0 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c  e.  In this say,
2e8d0 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   all.** root pag
2e8e0 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74  es are kept at t
2e8f0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2e900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e910 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e  e, which.** is n
2e920 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54  ecessary for AUT
2e930 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20  OVACUUM to work 
2e940 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64  right.  *piMoved
2e950 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a   is set to the .
2e960 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ** page number t
2e970 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74  hat used to be t
2e980 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2e990 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65  e in the file be
2e9a0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65  fore.** the move
2e9b0 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65  .  If no page ge
2e9c0 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76  ts moved, *piMov
2e9d0 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ed is set to 0..
2e9e0 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74  ** The last root
2e9f0 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65   page is recorde
2ea00 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64  d in meta[3] and
2ea10 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
2ea20 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61   meta[3] is upda
2ea30 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ted by this proc
2ea40 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  edure..*/.static
2ea50 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61   int btreeDropTa
2ea60 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2ea70 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
2ea80 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
2ea90 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2eaa0 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  age = 0;.  BtSha
2eab0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2eac0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
2ead0 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
2eae0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2eaf0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  );.  if( p->inTr
2eb00 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2eb10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2eb20 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2eb30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2eb40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2eb50 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
2eb60 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
2eb70 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2eb80 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2eb90 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2eba0 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2ebb0 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2ebc0 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2ebd0 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2ebe0 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
2ebf0 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
2ec00 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
2ec10 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
2ec20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
2ec30 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
2ec40 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
2ec50 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
2ec60 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
2ec70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2ec80 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2ec90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2eca0 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
2ecb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2ecc0 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
2ecd0 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
2ece0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2ecf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
2ed00 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
2ed10 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
2ed20 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ble);.  if( rc )
2ed30 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2ed40 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2ed50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2ed60 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20  *piMoved = 0;.. 
2ed70 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b   if( iTable>1 ){
2ed80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2ed90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2eda0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2edb0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c  (pPage);.    rel
2edc0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2edd0 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
2ede0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2edf0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78  {.      Pgno max
2ee00 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
2ee10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ee20 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
2ee30 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
2ee40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ee50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ee60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2ee70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ge);.        ret
2ee80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2ee90 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c  .      if( iTabl
2eea0 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29  e==maxRootPgno )
2eeb0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2eec0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2eed0 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74  dropped is the t
2eee0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61  able with the la
2eef0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2ef00 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
2ef10 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2ef20 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20  e, put the root 
2ef30 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2ef40 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20   list. .        
2ef50 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2ef60 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2ef70 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ef80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2ef90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2efa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2efb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2efc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2efd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2efe0 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
2eff0 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f   dropped does no
2f000 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65  t have the large
2f010 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2f020 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
2f030 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2f040 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  So move the page
2f050 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20   that does into 
2f060 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
2f070 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
2f080 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67  deleted root-pag
2f090 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
2f0a0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2f0b0 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65  Move;.        re
2f0c0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2f0d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2f0e0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2f0f0 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
2f100 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
2f110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2f120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f130 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f140 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2f150 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
2f160 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76  tePage(pBt, pMov
2f170 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e, PTRMAP_ROOTPA
2f180 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a  GE, 0, iTable);.
2f190 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2f1a0 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
2f1b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f1c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f1d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f1e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f1f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2f200 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
2f210 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
2f220 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2f230 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2f250 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2f260 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2f270 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  freePage(pMove);
2f280 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2f290 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2f2a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f2b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f2c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f2d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f2e0 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52   *piMoved = maxR
2f2f0 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ootPgno;.      }
2f300 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
2f310 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74  he new 'max-root
2f320 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20  -page' value in 
2f330 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
2f340 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20  der. This.      
2f350 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61  ** is the old va
2f360 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65  lue less one, le
2f370 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74  ss one more if t
2f380 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20  hat happens to. 
2f390 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f       ** be a roo
2f3a0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c  t-page number, l
2f3b0 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66  ess one again if
2f3c0 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20   that is the.   
2f3d0 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
2f3e0 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a  TE_PAGE..      *
2f3f0 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50  /.      maxRootP
2f400 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  gno--;.      if(
2f410 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45   maxRootPgno==PE
2f420 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2f430 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
2f440 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
2f450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f460 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54   maxRootPgno==PT
2f470 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
2f480 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b   maxRootPgno) ){
2f490 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
2f4a0 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
2f4b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
2f4c0 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49  xRootPgno!=PENDI
2f4d0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2f4e0 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) );..      rc =
2f4f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2f500 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61  ateMeta(p, 4, ma
2f510 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
2f520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2f530 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2f540 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2f550 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2f560 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
2f570 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c  e{.    /* If sql
2f580 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2f590 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e  le was called on
2f5a0 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20   page 1. */.    
2f5b0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2f5c0 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2f5d0 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  EAF );.    relea
2f5e0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2f5f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
2f600 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   .}.int sqlite3B
2f610 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74  treeDropTable(Bt
2f620 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2f630 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64  le, int *piMoved
2f640 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2f650 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2f660 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  (p);.  rc = btre
2f670 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54  eDropTable(p, iT
2f680 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a  able, piMoved);.
2f690 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2f6a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
2f6b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2f6c0 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66  ead the meta-inf
2f6d0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  ormation out of 
2f6e0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
2f6f0 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
2f700 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
2f710 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ee pages current
2f720 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ly in the databa
2f730 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20  se.  Meta[1].** 
2f740 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d  through meta[15]
2f750 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66   are available f
2f760 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72  or use by higher
2f770 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30   layers.  Meta[0
2f780 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ].** is read-onl
2f790 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72  y, the others ar
2f7a0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a  e read/write..**
2f7b0 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20   .** The schema 
2f7c0 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  layer numbers me
2f7d0 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  ta values differ
2f7e0 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73  ently.  At the s
2f7f0 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28  chema.** layer (
2f800 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69  and the SetCooki
2f810 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65  e and ReadCookie
2f820 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75   opcodes) the nu
2f830 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20  mber of.** free 
2f840 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73  pages is not vis
2f850 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65  ible.  So Cookie
2f860 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20  [0] is the same 
2f870 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69  as Meta[1]..*/.i
2f880 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
2f890 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  etMeta(Btree *p,
2f8a0 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
2f8b0 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20  Meta){.  DbPage 
2f8c0 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20  *pDbPage;.  int 
2f8d0 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2f8e0 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68  har *pP1;.  BtSh
2f8f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2f900 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
2f910 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  reeEnter(p);..  
2f920 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74  /* Reading a met
2f930 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71  a-data value req
2f940 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
2f950 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64  k on page 1 (and
2f960 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   hence.  ** the 
2f970 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
2f980 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69  ble. We grab thi
2f990 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73  s lock regardles
2f9a0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a  s of whether or.
2f9b0 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c    ** not the SQL
2f9c0 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2f9d0 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
2f9e0 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65  (the table roote
2f9f0 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31  d at page.  ** 1
2fa00 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
2fa10 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79   special case by
2fa20 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2fa30 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28  ) and lockTable(
2fa40 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ))..  */.  rc = 
2fa50 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
2fa60 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
2fa70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2fa80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2fa90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2faa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2fab0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2fac0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
2fad0 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  5 );.  rc = sqli
2fae0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
2faf0 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62  >pPager, 1, &pDb
2fb00 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2fb10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
2fb20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
2fb30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2fb40 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65    pP1 = (unsigne
2fb50 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
2fb60 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
2fb70 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20  Page);.  *pMeta 
2fb80 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b  = get4byte(&pP1[
2fb90 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20  36 + idx*4]);.  
2fba0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2fbb0 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  f(pDbPage);..  /
2fbc0 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65  * If autovacuume
2fbd0 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  d is disabled in
2fbe0 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20   this build but 
2fbf0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
2fc00 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e   .  ** access an
2fc10 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61   autovacuumed da
2fc20 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b  tabase, then mak
2fc30 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  e the database r
2fc40 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23  eadonly. .  */.#
2fc50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2fc60 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
2fc70 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d  f( idx==4 && *pM
2fc80 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61  eta>0 ) pBt->rea
2fc90 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69  dOnly = 1;.#endi
2fca0 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  f..  /* Grab the
2fcb0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
2fcc0 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ge 1. */.  rc = 
2fcd0 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20  lockTable(p, 1, 
2fce0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71  READ_LOCK);.  sq
2fcf0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2fd00 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2fd10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
2fd20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
2fd30 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
2fd40 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
2fd50 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
2fd60 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
2fd70 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
2fd80 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2fd90 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
2fda0 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69  , int idx, u32 i
2fdb0 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65  Meta){.  BtShare
2fdc0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2fdd0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2fde0 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b   *pP1;.  int rc;
2fdf0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2fe00 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  1 && idx<=15 );.
2fe10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2fe20 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ter(p);.  if( p-
2fe30 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2fe40 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
2fe50 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2fe60 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2fe70 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2fe80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2fe90 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
2fea0 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31  e1!=0 );.    pP1
2feb0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   = pBt->pPage1->
2fec0 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
2fed0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2fee0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
2fef0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2ff00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ff10 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2ff20 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
2ff30 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 20 20 20  ], iMeta);.     
2ff40 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20   if( idx==7 ){. 
2ff50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2ff60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c  Bt->autoVacuum |
2ff70 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20  | iMeta==0 );.  
2ff80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4d        assert( iM
2ff90 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d  eta==0 || iMeta=
2ffa0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42  =1 );.        pB
2ffb0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
2ffc0 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20  iMeta;.      }. 
2ffd0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2ffe0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2fff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30000 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
30010 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74  e flag byte at t
30020 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
30030 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
30040 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63  e cursor.** is c
30050 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
30060 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  g to..*/.int sql
30070 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 42  ite3BtreeFlags(B
30080 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
30090 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
300a0 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51  about CURSOR_REQ
300b0 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20  UIRESEEK state? 
300c0 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f  Probably need to
300d0 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f   call.  ** resto
300e0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
300f0 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a  osition() here..
30100 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a    */.  MemPage *
30110 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
30120 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
30130 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
30140 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  Held(pPage->pBt-
30150 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
30160 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67  urn pPage ? pPag
30170 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
30180 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a  hdrOffset] : 0;.
30190 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
301a0 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
301b0 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
301c0 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
301d0 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
301e0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
301f0 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
30200 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
30210 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
30220 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
30230 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
30240 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e  eld(p->pSqlite->
30250 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
30260 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
30270 4d 75 74 65 78 48 65 6c 64 28 70 2d 3e 70 42 74  MutexHeld(p->pBt
30280 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
30290 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61  turn p->pBt->pPa
302a0 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ger;.}..#ifndef 
302b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
302c0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
302d0 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
302e0 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
302f0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
30300 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
30310 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
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 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
30340 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
30350 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
30360 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
30370 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 32  p;.  char *zMsg2
30380 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d  ;.  if( !pCheck-
30390 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b  >mxErr ) return;
303a0 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  .  pCheck->mxErr
303b0 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45  --;.  pCheck->nE
303c0 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74  rr++;.  va_start
303d0 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
303e0 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65 33   zMsg2 = sqlite3
303f0 56 4d 50 72 69 6e 74 66 28 30 2c 20 7a 46 6f 72  VMPrintf(0, zFor
30400 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
30410 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d  nd(ap);.  if( zM
30420 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d  sg1==0 ) zMsg1 =
30430 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63   "";.  if( pChec
30440 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  k->zErrMsg ){.  
30450 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70    char *zOld = p
30460 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a  Check->zErrMsg;.
30470 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72      pCheck->zErr
30480 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Msg = 0;.    sql
30490 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
304a0 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20  Check->zErrMsg, 
304b0 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67  zOld, "\n", zMsg
304c0 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a  1, zMsg2, (char*
304d0 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )0);.    sqlite3
304e0 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d  _free(zOld);.  }
304f0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
30500 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65  3SetString(&pChe
30510 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73  ck->zErrMsg, zMs
30520 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72  g1, zMsg2, (char
30530 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  *)0);.  }.  sqli
30540 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 32 29 3b  te3_free(zMsg2);
30550 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
30560 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
30570 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
30580 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30590 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
305a0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20  ./*.** Add 1 to 
305b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
305c0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61  unt for page iPa
305d0 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ge.  If this is 
305e0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65  the second.** re
305f0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
30600 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f  age, add an erro
30610 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68  r message to pCh
30620 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  eck->zErrMsg..**
30630 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
30640 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72  re are 2 ore mor
30650 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
30660 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69  the page and 0 i
30670 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  f.** if this is 
30680 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65  the first refere
30690 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e  nce to the page.
306a0 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63  .**.** Also chec
306b0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
306c0 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75  number is in bou
306d0 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nds..*/.static i
306e0 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65  nt checkRef(Inte
306f0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
30700 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72   int iPage, char
30710 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69   *zContext){.  i
30720 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
30730 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50  turn 1;.  if( iP
30740 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67  age>pCheck->nPag
30750 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a  e || iPage<0 ){.
30760 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30770 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30780 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61  ext, "invalid pa
30790 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69  ge number %d", i
307a0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
307b0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
307c0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
307d0 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68  ge]==1 ){.    ch
307e0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
307f0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
30800 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f  2nd reference to
30810 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
30820 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
30830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28  .  }.  return  (
30840 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
30850 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69  age]++)>1;.}..#i
30860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30870 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
30880 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
30890 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  e entry in the p
308a0 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70  ointer-map for p
308b0 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20  age iChild maps 
308c0 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72  to .** page iPar
308d0 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70  ent, pointer typ
308e0 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f  e ptrType. If no
308f0 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72  t, append an err
30900 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f  or message.** to
30910 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74   pCheck..*/.stat
30920 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72  ic void checkPtr
30930 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79  map(.  Integrity
30940 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a  Ck *pCheck,   /*
30950 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
30960 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67   context */.  Pg
30970 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
30980 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61       /* Child pa
30990 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75  ge number */.  u
309a0 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
309b0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
309c0 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79  d pointer map ty
309d0 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61  pe */.  Pgno iPa
309e0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f  rent,          /
309f0 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
30a00 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61  er map parent pa
30a10 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
30a20 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
30a30 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
30a40 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73   description (us
30a50 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67  ed for error msg
30a60 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
30a70 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79  ;.  u8 ePtrmapTy
30a80 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d  pe;.  Pgno iPtrm
30a90 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20  apParent;..  rc 
30aa0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65  = ptrmapGet(pChe
30ab0 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c  ck->pBt, iChild,
30ac0 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26   &ePtrmapType, &
30ad0 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
30ae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  _OK ){.    check
30b00 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30b10 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69  , zContext, "Fai
30b20 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d  led to read ptrm
30b30 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69  ap key=%d", iChi
30b40 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ld);.    return;
30b50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72  .  }..  if( ePtr
30b60 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c  mapType!=eType |
30b70 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21  | iPtrmapParent!
30b80 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  =iParent ){.    
30b90 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30ba0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30bb0 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72   .      "Bad ptr
30bc0 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25   map entry key=%
30bd0 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25  d expected=(%d,%
30be0 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c  d) got=(%d,%d)",
30bf0 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20   .      iChild, 
30c00 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20  eType, iParent, 
30c10 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74  ePtrmapType, iPt
30c20 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  rmapParent);.  }
30c30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
30c40 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
30c50 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
30c60 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76  list or of an ov
30c70 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
30c80 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  ..** Verify that
30c90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
30ca0 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  ages on the list
30cb0 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   is N..*/.static
30cc0 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28   void checkList(
30cd0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
30ce0 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65  pCheck,  /* Inte
30cf0 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63  grity checking c
30d00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
30d10 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20  isFreeList,     
30d20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
30d30 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65  freelist.  False
30d40 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61   for overflow pa
30d50 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ge list */.  int
30d60 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
30d70 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
30d80 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65  r for first page
30d90 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
30da0 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
30db0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
30dc0 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ted number of pa
30dd0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
30de0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
30df0 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ext        /* Co
30e00 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
30e10 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  messages */.){. 
30e20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78   int i;.  int ex
30e30 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e  pected = N;.  in
30e40 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65  t iFirst = iPage
30e50 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e  ;.  while( N-- >
30e60 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78   0 && pCheck->mx
30e70 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67  Err ){.    DbPag
30e80 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20  e *pOvflPage;.  
30e90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30ea0 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20  *pOvflData;.    
30eb0 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20  if( iPage<1 ){. 
30ec0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
30ed0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30ee0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22  text,.         "
30ef0 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d  %d of %d pages m
30f00 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72  issing from over
30f10 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69  flow list starti
30f20 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20  ng at %d",.     
30f30 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74       N+1, expect
30f40 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  ed, iFirst);.   
30f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30f60 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66      if( checkRef
30f70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
30f80 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61  zContext) ) brea
30f90 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  k;.    if( sqlit
30fa0 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65 63  e3PagerGet(pChec
30fb0 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f  k->pPager, (Pgno
30fc0 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61  )iPage, &pOvflPa
30fd0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ge) ){.      che
30fe0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30ff0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66  ck, zContext, "f
31000 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67  ailed to get pag
31010 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
31020 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31030 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20  }.    pOvflData 
31040 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
31050 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
31060 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65  etData(pOvflPage
31070 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72 65  );.    if( isFre
31080 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  eList ){.      i
31090 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  nt n = get4byte(
310a0 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a  &pOvflData[4]);.
310b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
310c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
310d0 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
310e0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
310f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31100 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31110 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
31120 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
31130 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
31140 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e  ndif.      if( n
31150 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73  >pCheck->pBt->us
31160 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a  ableSize/4-8 ){.
31170 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
31180 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
31190 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
311a0 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65      "freelist le
311b0 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67  af count too big
311c0 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50   on page %d", iP
311d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d  age);.        N-
311e0 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
311f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
31200 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
31210 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
31220 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
31230 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34  &pOvflData[8+i*4
31240 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
31250 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31260 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  UM.          if(
31270 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
31280 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
31290 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
312a0 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65  map(pCheck, iFre
312b0 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  ePage, PTRMAP_FR
312c0 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
312d0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
312e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
312f0 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65     checkRef(pChe
31300 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a  ck, iFreePage, z
31310 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
31320 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d    }.        N -=
31330 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
31340 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
31350 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31360 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
31370 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
31380 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
31390 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50  to-vacuum and iP
313a0 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  age is not the l
313b0 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ast.      ** pag
313c0 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c  e in this overfl
313d0 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74  ow list, check t
313e0 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hat the pointer-
313f0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
31400 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
31410 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65  wing page matche
31420 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a  s iPage..      *
31430 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  /.      if( pChe
31440 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
31450 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20  uum && N>0 ){.  
31460 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79        i = get4by
31470 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
31480 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
31490 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54  ap(pCheck, i, PT
314a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
314b0 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
314c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
314d0 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65  #endif.    iPage
314e0 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
314f0 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  lData);.    sqli
31500 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
31510 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  vflPage);.  }.}.
31520 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31530 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
31540 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
31550 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
31560 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
31570 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73  .** Do various s
31580 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20  anity checks on 
31590 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66  a single page of
315a0 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e   a tree.  Return
315b0 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70  .** the tree dep
315c0 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20  th.  Root pages 
315d0 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e  return 0.  Paren
315e0 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ts of root pages
315f0 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e  .** return 1, an
31600 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a  d so forth..** .
31610 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20  ** These checks 
31620 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  are done:.**.** 
31630 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75       1.  Make su
31640 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e  re that cells an
31650 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20  d freeblocks do 
31660 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20  not overlap.**  
31670 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62          but comb
31680 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ine to completel
31690 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65  y cover the page
316a0 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61  ..**  NO  2.  Ma
316b0 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79  ke sure cell key
316c0 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a  s are in order..
316d0 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65  **  NO  3.  Make
316e0 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
316f0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
31700 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e  al to zLowerBoun
31710 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d  d..**  NO  4.  M
31720 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
31730 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
31740 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70  or equal to zUpp
31750 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20  erBound..**     
31760 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69   5.  Check the i
31770 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72  ntegrity of over
31780 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20  flow pages..**  
31790 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76      6.  Recursiv
317a0 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72  ely call checkTr
317b0 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68  eePage on all ch
317c0 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20  ildren..**      
317d0 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  7.  Verify that 
317e0 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c  the depth of all
317f0 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65   children is the
31800 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38   same..**      8
31810 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
31820 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61  s page is at lea
31830 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65  st 33% full or e
31840 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  lse it is.**    
31850 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f        the root o
31860 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73  f the tree..*/.s
31870 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54  tatic int checkT
31880 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67  reePage(.  Integ
31890 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
318a0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
318b0 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  the sanity check
318c0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
318d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
318e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
318f0 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20  e page to check 
31900 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
31910 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61  arent,     /* Pa
31920 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63  rent page */.  c
31930 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74  har *zParentCont
31940 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63  ext  /* Parent c
31950 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d  ontext */.){.  M
31960 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
31970 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74   int i, rc, dept
31980 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74  h, d2, pgno, cnt
31990 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c  ;.  int hdr, cel
319a0 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43  lStart;.  int nC
319b0 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b  ell;.  u8 *data;
319c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
319d0 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
319e0 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74  ze;.  char zCont
319f0 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72  ext[100];.  char
31a00 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65   *hit;..  sqlite
31a10 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31a20 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
31a30 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a  ntext, "Page %d:
31a40 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f   ", iPage);..  /
31a50 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
31a60 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a   page exists.  *
31a70 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b  /.  pBt = pCheck
31a80 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53  ->pBt;.  usableS
31a90 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
31aa0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61  eSize;.  if( iPa
31ab0 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
31ac0 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66  ;.  if( checkRef
31ad0 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
31ae0 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20  zParentContext) 
31af0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
31b00 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  ( (rc = sqlite3B
31b10 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
31b20 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70   (Pgno)iPage, &p
31b30 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Page, 0))!=0 ){.
31b40 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31b50 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
31b60 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61  ext,.       "una
31b70 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70  ble to get the p
31b80 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d  age. error code=
31b90 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
31ba0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
31bb0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  ( (rc = sqlite3B
31bc0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
31bd0 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30  ge, pParent))!=0
31be0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
31bf0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
31c00 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71               "sq
31c20 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
31c30 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72  ge() returns err
31c40 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29  or code %d", rc)
31c50 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
31c60 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
31c70 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
31c80 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20  * Check out all 
31c90 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  the cells..  */.
31ca0 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66    depth = 0;.  f
31cb0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
31cc0 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b  >nCell && pCheck
31cd0 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20  ->mxErr; i++){. 
31ce0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
31cf0 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65    int sz;.    Ce
31d00 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
31d10 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f    /* Check paylo
31d20 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ad overflow page
31d30 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  s.    */.    sql
31d40 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
31d50 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
31d60 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
31d70 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20         "On tree 
31d80 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a  page %d cell %d:
31d90 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20   ", iPage, i);. 
31da0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
31db0 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20  ell(pPage,i);.  
31dc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
31dd0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
31de0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
31df0 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e  .    sz = info.n
31e00 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70  Data;.    if( !p
31e10 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73  Page->intKey ) s
31e20 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  z += info.nKey;.
31e30 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d      assert( sz==
31e40 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
31e50 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f  .    if( sz>info
31e60 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
31e70 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a   int nPage = (sz
31e80 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
31e90 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29   usableSize - 5)
31ea0 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  /(usableSize - 4
31eb0 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  );.      Pgno pg
31ec0 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
31ed0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
31ee0 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64  verflow]);.#ifnd
31ef0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31f00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
31f10 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31f20 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
31f30 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
31f40 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  k, pgnoOvfl, PTR
31f50 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69  MAP_OVERFLOW1, i
31f60 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
31f70 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
31f80 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28        checkList(
31f90 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f  pCheck, 0, pgnoO
31fa0 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e  vfl, nPage, zCon
31fb0 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  text);.    }..  
31fc0 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74    /* Check sanit
31fd0 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20  y of left child 
31fe0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
31ff0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
32000 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20  f ){.      pgno 
32010 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
32020 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
32030 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32040 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
32050 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
32060 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
32070 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ap(pCheck, pgno,
32080 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69   PTRMAP_BTREE, i
32090 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
320a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
320b0 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b        d2 = check
320c0 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c  TreePage(pCheck,
320d0 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74  pgno,pPage,zCont
320e0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
320f0 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68  i>0 && d2!=depth
32100 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
32110 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
32120 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68  k, zContext, "Ch
32130 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64  ild page depth d
32140 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20  iffers");.      
32150 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20  }.      depth = 
32160 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d2;.    }.  }.  
32170 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
32180 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
32190 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
321a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
321b0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
321c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
321d0 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
321e0 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  ), zContext, .  
321f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32200 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61     "On page %d a
32210 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22  t right child: "
32220 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65  , iPage);.#ifnde
32230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32240 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
32250 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
32260 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50   ){.      checkP
32270 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
32280 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
32290 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  , iPage, 0);.   
322a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
322b0 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
322c0 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c  ck, pgno, pPage,
322d0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a   zContext);.  }.
322e0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72   .  /* Check for
322f0 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61   complete covera
32300 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  ge of the page. 
32310 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61   */.  data = pPa
32320 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
32330 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
32340 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c  set;.  hit = sql
32350 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
32360 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
32370 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20 6d  if( hit ){.    m
32380 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65  emset(hit, 1, ge
32390 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
323a0 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  +5]));.    nCell
323b0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
323c0 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63  a[hdr+3]);.    c
323d0 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b  ellStart = hdr +
323e0 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
323f0 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  eaf;.    for(i=0
32400 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
32410 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20  .      int pc = 
32420 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
32430 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a  ellStart+i*2]);.
32440 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
32450 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
32460 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a  ge, &data[pc]);.
32470 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
32480 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d     if( (pc+size-
32490 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  1)>=usableSize |
324a0 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  | pc<0 ){.      
324b0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
324c0 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
324d0 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
324e0 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
324f0 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65   cell %d on page
32500 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b   %d",i,iPage,0);
32510 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32520 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73        for(j=pc+s
32530 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d  ize-1; j>=pc; j-
32540 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
32550 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
32560 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32  or(cnt=0, i=get2
32570 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
32580 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61  ]); i>0 && i<usa
32590 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31  bleSize && cnt<1
325a0 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20  0000; .         
325b0 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20    cnt++){.      
325c0 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62  int size = get2b
325d0 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b  yte(&data[i+2]);
325e0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
325f0 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d      if( (i+size-
32600 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  1)>=usableSize |
32610 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  | i<0 ){.       
32620 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32630 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20  pCheck, 0,  .   
32640 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
32650 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
32660 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65   cell %d on page
32670 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b   %d",i,iPage,0);
32680 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32690 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69        for(j=i+si
326a0 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29  ze-1; j>=i; j--)
326b0 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20   hit[j]++;.     
326c0 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74   }.      i = get
326d0 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b  2byte(&data[i]);
326e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
326f0 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65  =cnt=0; i<usable
32700 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Size; i++){.    
32710 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20    if( hit[i]==0 
32720 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  ){.        cnt++
32730 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
32740 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20  ( hit[i]>1 ){.  
32750 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
32760 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a  dMsg(pCheck, 0,.
32770 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69            "Multi
32780 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74  ple uses for byt
32790 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22  e %d of page %d"
327a0 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  , i, iPage);.   
327b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
327c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
327d0 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b  ( cnt!=data[hdr+
327e0 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  7] ){.      chec
327f0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
32800 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
32810 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61   "Fragmented spa
32820 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65  ce is %d byte re
32830 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20  ported as %d on 
32840 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20  page %d",.      
32850 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64      cnt, data[hd
32860 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  r+7], iPage);.  
32870 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
32880 33 5f 66 72 65 65 28 68 69 74 29 3b 0a 0a 20 20  3_free(hit);..  
32890 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
328a0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70  e);.  return dep
328b0 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  th+1;.}.#endif /
328c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
328d0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
328e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
328f0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
32900 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CHECK./*.** This
32910 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
32920 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f  complete check o
32930 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65  f the given BTre
32940 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d  e file.  aRoot[]
32950 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20   is.** an array 
32960 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  of pages numbers
32970 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20   were each page 
32980 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f  number is the ro
32990 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20  ot page of.** a 
329a0 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73  table.  nRoot is
329b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
329c0 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e  ntries in aRoot.
329d0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
329e0 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c  hing checks out,
329f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
32a00 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20  turns NULL.  If 
32a10 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20  something is.** 
32a20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20  amiss, an error 
32a30 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
32a40 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
32a50 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
32a60 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70  loc().** and a p
32a70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65  ointer to that e
32a80 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
32a90 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63  returned.  The c
32aa0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
32ab0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
32ac0 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
32ad0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
32ae0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
32af0 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
32b00 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
32b10 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70  heck(.  Btree *p
32b20 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72  ,     /* The btr
32b30 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  ee to be checked
32b40 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
32b50 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20  ,   /* An array 
32b60 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  of root pages nu
32b70 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69  mbers for indivi
32b80 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20  dual trees */.  
32b90 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a  int nRoot,    /*
32ba0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
32bb0 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f  es in aRoot[] */
32bc0 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20  .  int mxErr,   
32bd0 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69   /* Stop reporti
32be0 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20  ng errors after 
32bf0 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69  this many */.  i
32c00 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20  nt *pnErr    /* 
32c10 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  Write number of 
32c20 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74  errors seen to t
32c30 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  his variable */.
32c40 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
32c50 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72  t nRef;.  Integr
32c60 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20  ityCk sCheck;.  
32c70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32c80 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
32c90 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
32ca0 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  .  nRef = sqlite
32cb0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
32cc0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
32cd0 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  f( lockBtreeWith
32ce0 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45  Retry(p)!=SQLITE
32cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
32d00 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
32d10 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
32d20 74 65 33 53 74 72 44 75 70 28 22 55 6e 61 62 6c  te3StrDup("Unabl
32d30 65 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72  e to acquire a r
32d40 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
32d50 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a  database");.  }.
32d60 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70    sCheck.pBt = p
32d70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61  Bt;.  sCheck.pPa
32d80 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
32d90 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  r;.  sCheck.nPag
32da0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
32db0 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b  Pagecount(sCheck
32dc0 2e 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65  .pPager);.  sChe
32dd0 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72  ck.mxErr = mxErr
32de0 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20  ;.  sCheck.nErr 
32df0 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20  = 0;.  *pnErr = 
32e00 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
32e10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32e20 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  M.  if( pBt->nTr
32e30 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43  unc!=0 ){.    sC
32e40 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74  heck.nPage = pBt
32e50 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65  ->nTrunc;.  }.#e
32e60 6e 64 69 66 0a 20 20 69 66 28 20 73 43 68 65 63  ndif.  if( sChec
32e70 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  k.nPage==0 ){.  
32e80 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
32e90 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
32ea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
32eb0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
32ec0 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b   0;.  }.  sCheck
32ed0 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  .anRef = sqlite3
32ee0 5f 6d 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b  _malloc( (sCheck
32ef0 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
32f00 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
32f10 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65  ) );.  if( !sChe
32f20 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20  ck.anRef ){.    
32f30 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
32f40 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  sed(pBt);.    *p
32f50 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71  nErr = 1;.    sq
32f60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
32f70 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  p);.    return s
32f80 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 2d  qlite3MPrintf(p-
32f90 3e 70 53 71 6c 69 74 65 2c 20 22 55 6e 61 62 6c  >pSqlite, "Unabl
32fa0 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62  e to malloc %d b
32fb0 79 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20  ytes", .        
32fc0 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29  (sCheck.nPage+1)
32fd0 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61  *sizeof(sCheck.a
32fe0 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  nRef[0]));.  }. 
32ff0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68   for(i=0; i<=sCh
33000 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  eck.nPage; i++){
33010 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
33020 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45   = 0; }.  i = PE
33030 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
33040 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73  pBt);.  if( i<=s
33050 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20  Check.nPage ){. 
33060 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b     sCheck.anRef[
33070 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43  i] = 1;.  }.  sC
33080 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30  heck.zErrMsg = 0
33090 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
330a0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
330b0 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f  he freelist.  */
330c0 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43  .  checkList(&sC
330d0 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74  heck, 1, get4byt
330e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
330f0 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20  aData[32]),.    
33100 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
33110 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
33120 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e  Data[36]), "Main
33130 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a   freelist: ");..
33140 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74    /* Check all t
33150 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  he tables..  */.
33160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f    for(i=0; i<nRo
33170 6f 74 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45  ot && sCheck.mxE
33180 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rr; i++){.    if
33190 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20  ( aRoot[i]==0 ) 
331a0 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65  continue;.#ifnde
331b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
331c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
331d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
331e0 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29   && aRoot[i]>1 )
331f0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72  {.      checkPtr
33200 6d 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  map(&sCheck, aRo
33210 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f  ot[i], PTRMAP_RO
33220 4f 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20  OTPAGE, 0, 0);. 
33230 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
33240 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 26 73  checkTreePage(&s
33250 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
33260 20 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65   0, "List of tre
33270 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d  e roots: ");.  }
33280 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
33290 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
332a0 68 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 72  he file is refer
332b0 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72  enced.  */.  for
332c0 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e  (i=1; i<=sCheck.
332d0 6e 50 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e  nPage && sCheck.
332e0 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66  mxErr; i++){.#if
332f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33300 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
33310 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
33320 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  i]==0 ){.      c
33330 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
33340 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20  Check, 0, "Page 
33350 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  %d is never used
33360 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  ", i);.    }.#el
33370 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  se.    /* If the
33380 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
33390 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
333a0 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62  make sure no tab
333b0 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  les contain.    
333c0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
333d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
333e0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
333f0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
33400 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]==0 && .      
33410 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
33420 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70  pBt, i)!=i || !p
33430 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20  Bt->autoVacuum) 
33440 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
33450 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
33460 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20   0, "Page %d is 
33470 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
33480 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
33490 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d  Check.anRef[i]!=
334a0 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54  0 && .       (PT
334b0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
334c0 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61   i)==i && pBt->a
334d0 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20  utoVacuum) ){.  
334e0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
334f0 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
33500 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
33510 20 25 64 20 69 73 20 72 65 66 65 72 65 6e 63 65   %d is reference
33520 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65  d", i);.    }.#e
33530 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ndif.  }..  /* M
33540 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 61 6e  ake sure this an
33550 61 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c  alysis did not l
33560 65 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29  eave any unref()
33570 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e   pages.  */.  un
33580 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
33590 64 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52  d(pBt);.  if( nR
335a0 65 66 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67  ef != sqlite3Pag
335b0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
335c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63  pPager) ){.    c
335d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
335e0 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
335f0 20 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61   "Outstanding pa
33600 67 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72  ge count goes fr
33610 6f 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69  om %d to %d duri
33620 6e 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  ng this analysis
33630 22 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73  ",.      nRef, s
33640 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
33650 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
33660 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  .    );.  }..  /
33670 2a 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20  * Clean  up and 
33680 72 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20  report errors.. 
33690 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
336a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 73 71  eeLeave(p);.  sq
336b0 6c 69 74 65 33 5f 66 72 65 65 28 73 43 68 65 63  lite3_free(sChec
336c0 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45  k.anRef);.  *pnE
336d0 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
336e0 3b 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63  ;.  return sChec
336f0 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e  k.zErrMsg;.}.#en
33700 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
33710 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
33720 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CK */../*.** Ret
33730 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
33740 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64  hname of the und
33750 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
33760 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
33770 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
33780 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74  eeGetFilename(Bt
33790 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
337a0 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
337b0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
337c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
337d0 74 65 78 48 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  texHeld(p->pBt->
337e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
337f0 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  rn sqlite3PagerF
33800 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  ilename(p->pBt->
33810 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
33820 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74  * Return the pat
33830 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72  hname of the dir
33840 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
33850 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
33860 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
33870 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
33880 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74  reeGetDirname(Bt
33890 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
338a0 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
338b0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
338c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
338d0 74 65 78 48 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  texHeld(p->pBt->
338e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
338f0 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  rn sqlite3PagerD
33900 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
33910 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
33920 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
33930 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
33940 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
33950 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
33960 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
33970 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
33980 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
33990 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
339a0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
339b0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
339c0 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
339d0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
339e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
339f0 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a  rnalname(Btree *
33a00 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
33a10 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
33a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
33a30 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65  ite3BtreeMutexHe
33a40 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
33a50 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
33a60 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
33a70 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  lname(p->pBt->pP
33a80 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ager);.}..#ifnde
33a90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
33aa0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  CUUM./*.** Copy 
33ab0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
33ac0 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20  tent of pBtFrom 
33ad0 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74  into pBtTo.  A t
33ae0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75  ransaction.** mu
33af0 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f 72  st be active for
33b00 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a   both files..**.
33b10 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66  ** The size of f
33b20 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20  ile pBtFrom may 
33b30 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68  be reduced by th
33b40 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
33b50 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
33b60 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61  s wrong, the tra
33b70 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46  nsaction on pBtF
33b80 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  rom is rolled ba
33b90 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
33ba0 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28  t btreeCopyFile(
33bb0 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65  Btree *pTo, Btre
33bc0 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74  e *pFrom){.  int
33bd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33be0 0a 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65  .  Pgno i, nPage
33bf0 2c 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70  , nToPage, iSkip
33c00 3b 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ;..  BtShared *p
33c10 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b  BtTo = pTo->pBt;
33c20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
33c30 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42  From = pFrom->pB
33c40 74 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69  t;..  if( pTo->i
33c50 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
33c60 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e  ITE || pFrom->in
33c70 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
33c80 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
33c90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
33ca0 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e   }.  if( pBtTo->
33cb0 70 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  pCursor ) return
33cc0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
33cd0 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65  nToPage = sqlite
33ce0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
33cf0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
33d00 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
33d10 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
33d20 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29  pBtFrom->pPager)
33d30 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44  ;.  iSkip = PEND
33d40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33d50 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  tTo);.  for(i=1;
33d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33d70 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29  & i<=nPage; i++)
33d80 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33d90 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33da0 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33db0 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33dc0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
33dd0 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c  From->pPager, i,
33de0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
33df0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
33e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33e10 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 70  PagerOverwrite(p
33e20 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c  BtTo->pPager, i,
33e30 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33e40 44 61 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a  Data(pDbPage));.
33e50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33e60 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
33e70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33e80 20 66 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69   file is shrinki
33e90 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20  ng, journal the 
33ea0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 62  pages that are b
33eb0 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20  eing truncated. 
33ec0 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79   ** so that they
33ed0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
33ee0 61 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  ack if the commi
33ef0 74 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  t fails..  */.  
33f00 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72  for(i=nPage+1; r
33f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33f20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29  i<=nToPage; i++)
33f30 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33f40 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33f50 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33f60 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33f70 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
33f80 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
33f90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33fa0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
33fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33fc0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
33fd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
33fe0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62  gerDontWrite(pDb
33ff0 50 61 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65  Page);.    /* Ye
34000 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69  ah.  It seems wi
34010 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74  erd to call Dont
34020 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66  Write() right af
34030 74 65 72 20 57 72 69 74 65 28 29 2e 20 20 42 75  ter Write().  Bu
34040 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
34050 20 62 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d   because the nam
34060 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63  es of those proc
34070 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78  edures do not ex
34080 61 63 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65  actly .    ** re
34090 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65  present what the
340a0 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72  y do.  Write() r
340b0 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74  eally means "put
340c0 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68   this page in th
340d0 65 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  e.    ** rollbac
340e0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61  k journal and ma
340f0 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73  rk it as dirty s
34100 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
34110 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
34120 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34130 20 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44   file later."  D
34140 6f 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65  ontWrite() undoe
34150 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
34160 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74  t of.    ** that
34170 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68   and prevents th
34180 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  e page from bein
34190 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  g written to the
341a0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a   database.  The.
341b0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73      ** page is s
341c0 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  till on the roll
341d0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
341e0 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20  ough.  And that 
341f0 69 73 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20  is the whole.   
34200 20 2a 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69   ** point of thi
34210 73 20 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70  s loop: to put p
34220 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  ages on the roll
34230 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  back journal. */
34240 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
34250 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
34260 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26  .  }.  if( !rc &
34270 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20  & nPage<nToPage 
34280 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
34290 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
342a0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
342b0 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  nPage);.  }..  i
342c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
342d0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
342e0 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  k(pTo);.  }.  re
342f0 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74  turn rc;  .}.int
34300 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70   sqlite3BtreeCop
34310 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f  yFile(Btree *pTo
34320 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b  , Btree *pFrom){
34330 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
34340 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
34350 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  To);.  sqlite3Bt
34360 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b  reeEnter(pFrom);
34370 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70  .  rc = btreeCop
34380 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d  yFile(pTo, pFrom
34390 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
343a0 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20  eLeave(pFrom);. 
343b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
343c0 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72  ve(pTo);.  retur
343d0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
343e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
343f0 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
34400 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
34410 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
34420 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
34430 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
34440 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  sInTrans(Btree *
34450 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
34460 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
34470 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
34480 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
34490 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
344a0 78 48 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65  xHeld(p->pSqlite
344b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
344c0 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69  turn (p && (p->i
344d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
344e0 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ITE));.}../*.** 
344f0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
34500 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  if a statement t
34510 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
34520 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
34530 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d  ite3BtreeIsInStm
34540 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  t(Btree *p){.  a
34550 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
34560 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 2d 3e  reeMutexHeld(p->
34570 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
34580 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34590 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
345a0 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
345b0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ) );.  return (p
345c0 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d  ->pBt && p->pBt-
345d0 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  >inStmt);.}../*.
345e0 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
345f0 72 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72  ro if a read (or
34600 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
34610 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
34620 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
34630 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
34640 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
34650 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
34660 65 4d 75 74 65 78 48 65 6c 64 28 70 2d 3e 70 42  eMutexHeld(p->pB
34670 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
34680 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
34690 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 2d 3e  reeMutexHeld(p->
346a0 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
346b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  );.  return (p &
346c0 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  & (p->inTrans!=T
346d0 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a  RANS_NONE));.}..
346e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
346f0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
34700 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20  inter to a blob 
34710 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
34720 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73  ated with.** a s
34730 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72  ingle shared-btr
34740 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69  ee. The memory i
34750 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74  s used by client
34760 20 63 6f 64 65 20 66 6f 72 20 69 74 27 73 20 6f   code for it's o
34770 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28  wn.** purposes (
34780 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
34790 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76  store a high-lev
347a0 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69  el schema associ
347b0 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
347c0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e  e shared-btree).
347d0 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   The btree layer
347e0 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e   manages referen
347f0 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75  ce counting issu
34800 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
34810 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
34820 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61   called on a sha
34830 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65  red-btree, nByte
34840 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  s bytes of memor
34850 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74  y.** are allocat
34860 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20  ed, zeroed, and 
34870 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
34880 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68  caller. For each
34890 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20   subsequent .** 
348a0 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20  call the nBytes 
348b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
348c0 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74  ored and a point
348d0 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62  er to the same b
348e0 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  lob.** of memory
348f0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a   returned. .**.*
34900 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68  * Just before th
34910 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69  e shared-btree i
34920 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75  s closed, the fu
34930 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73  nction passed as
34940 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61   the .** xFree a
34950 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65  rgument when the
34960 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
34970 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69  on was made is i
34980 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a  nvoked on the .*
34990 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61  * blob of alloca
349a0 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73  ted memory. This
349b0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
349c0 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65   not call sqlite
349d0 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74  3_free().** on t
349e0 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62  he memory, the b
349f0 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20  tree layer does 
34a00 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  that..*/.void *s
34a10 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
34a20 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
34a30 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46  nBytes, void(*xF
34a40 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20  ree)(void *)){. 
34a50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
34a60 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
34a70 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
34a80 75 74 65 78 48 65 6c 64 28 70 2d 3e 70 53 71 6c  utexHeld(p->pSql
34a90 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
34aa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
34ab0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 21 70 42  er(p);.  if( !pB
34ac0 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
34ad0 20 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d    pBt->pSchema =
34ae0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
34af0 72 6f 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20  ro(nBytes);.    
34b00 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
34b10 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20   = xFree;.  }.  
34b20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
34b30 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e(p);.  return p
34b40 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a  Bt->pSchema;.}..
34b50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
34b60 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65  e if another use
34b70 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68  r of the same sh
34b80 61 72 65 64 20 62 74 72 65 65 20 61 73 20 74 68  ared btree as th
34b90 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61  e argument.** ha
34ba0 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78  ndle holds an ex
34bb0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
34bc0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
34bd0 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  r table..*/.int 
34be0 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
34bf0 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a  maLocked(Btree *
34c00 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
34c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34c20 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 2d  treeMutexHeld(p-
34c30 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  >pSqlite->mutex)
34c40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
34c50 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
34c60 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65 4c 6f   = (queryTableLo
34c70 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
34c80 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53  T, READ_LOCK)!=S
34c90 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
34ca0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
34cb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
34cc0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
34cd0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
34ce0 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ACHE./*.** Obtai
34cf0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  n a lock on the 
34d00 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74  table whose root
34d10 20 70 61 67 65 20 69 73 20 69 54 61 62 2e 20 20   page is iTab.  
34d20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61  The.** lock is a
34d30 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69   write lock if i
34d40 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72  sWritelock is tr
34d50 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  ue or a read loc
34d60 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61  k.** if it is fa
34d70 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lse..*/.int sqli
34d80 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c  te3BtreeLockTabl
34d90 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
34da0 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74 65  iTab, u8 isWrite
34db0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
34dc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
34dd0 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69 73  8 lockType = (is
34de0 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f  WriteLock?WRITE_
34df0 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b  LOCK:READ_LOCK);
34e00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
34e10 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
34e20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
34e30 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
34e40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
34e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
34e60 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
34e70 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  iTab, lockType);
34e80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
34e90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
34ea0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
34eb0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
34ec0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
34ed0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
34ee0 70 43 73 72 20 6d 75 73 74 20 62 65 20 61 20 63  pCsr must be a c
34ef0 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72  ursor opened for
34f00 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a   writing on an .
34f10 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 20  ** INTKEY table 
34f20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
34f30 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 74 61  ng at a valid ta
34f40 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54  ble entry. .** T
34f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64  his function mod
34f60 69 66 69 65 73 20 74 68 65 20 64 61 74 61 20 73  ifies the data s
34f70 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
34f80 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20   that entry..** 
34f90 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 63 6f  Only the data co
34fa0 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62  ntent may only b
34fb0 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74 20 69  e modified, it i
34fc0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a  s not possible.*
34fd0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
34fe0 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
34ff0 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  ta stored..*/.in
35000 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 75  t sqlite3BtreePu
35010 74 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  tData(BtCursor *
35020 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCsr, u32 offset
35030 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
35040 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *z){.  assert( s
35050 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
35060 48 65 6c 64 28 70 43 73 72 2d 3e 70 42 74 72 65  Held(pCsr->pBtre
35070 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
35080 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
35090 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c  te3BtreeMutexHel
350a0 64 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCsr->pBtree->
350b0 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
350c0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 43 73 72  );.  assert(pCsr
350d0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
350e0 6c 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  le);.  if( pCsr-
350f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
35100 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
35110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35120 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f  _ABORT;.  }..  /
35130 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65  * Check some pre
35140 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a  conditions: .  *
35150 2a 20 20 20 28 61 29 20 74 68 65 20 63 75 72 73  *   (a) the curs
35160 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72 20 77  or is open for w
35170 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20 20 28  riting,.  **   (
35180 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  b) there is no r
35190 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
351a0 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69  table being modi
351b0 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20 20 20  fied and.  **   
351c0 28 63 29 20 74 68 65 20 63 75 72 73 6f 72 20 70  (c) the cursor p
351d0 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c 69 64  oints at a valid
351e0 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74 4b 65   row of an intKe
351f0 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
35200 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46 6c 61  if( !pCsr->wrFla
35210 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
35220 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
35230 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
35240 70 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCsr->pBtree->pB
35250 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20  t->readOnly .   
35260 20 20 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e         && pCsr->
35270 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 69 6e 54  pBtree->pBt->inT
35280 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
35290 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
352a0 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
352b0 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCsr->pBtree, pC
352c0 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  sr->pgnoRoot, pC
352d0 73 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sr) ){.    retur
352e0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
352f0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
35300 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
35310 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
35320 20 20 7d 0a 20 20 69 66 28 20 70 43 73 72 2d 3e    }.  if( pCsr->
35330 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
35340 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43 73 72 2d  NVALID || !pCsr-
35350 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  >pPage->intKey )
35360 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
35370 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
35380 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
35390 61 79 6c 6f 61 64 28 70 43 73 72 2c 20 6f 66 66  ayload(pCsr, off
353a0 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
353b0 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c 20 30 2c  ned char *)z, 0,
353c0 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53   1);.}../* .** S
353d0 65 74 20 61 20 66 6c 61 67 20 6f 6e 20 74 68 69  et a flag on thi
353e0 73 20 63 75 72 73 6f 72 20 74 6f 20 63 61 63 68  s cursor to cach
353f0 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20  e the locations 
35400 6f 66 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  of pages from th
35410 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 6c  e .** overflow l
35420 69 73 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  ist for the curr
35430 65 6e 74 20 72 6f 77 2e 20 54 68 69 73 20 69 73  ent row. This is
35440 20 75 73 65 64 20 62 79 20 63 75 72 73 6f 72 73   used by cursors
35450 20 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f 72 20 69   opened.** for i
35460 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
35470 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  IO only..**.** T
35480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
35490 73 20 61 20 66 6c 61 67 20 6f 6e 6c 79 2e 20 54  s a flag only. T
354a0 68 65 20 61 63 74 75 61 6c 20 70 61 67 65 20 6c  he actual page l
354b0 6f 63 61 74 69 6f 6e 20 63 61 63 68 65 0a 2a 2a  ocation cache.**
354c0 20 28 73 74 6f 72 65 64 20 69 6e 20 42 74 43 75   (stored in BtCu
354d0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
354e0 29 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  ) is allocated a
354f0 6e 64 20 75 73 65 64 20 62 79 20 66 75 6e 63 74  nd used by funct
35500 69 6f 6e 0a 2a 2a 20 61 63 63 65 73 73 50 61 79  ion.** accessPay
35510 6c 6f 61 64 28 29 20 28 74 68 65 20 77 6f 72 6b  load() (the work
35520 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
35530 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
35540 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
35550 33 42 74 72 65 65 50 75 74 44 61 74 61 28 29 29  3BtreePutData())
35560 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
35570 33 42 74 72 65 65 43 61 63 68 65 4f 76 65 72 66  3BtreeCacheOverf
35580 6c 6f 77 28 42 74 43 75 72 73 6f 72 20 2a 70 43  low(BtCursor *pC
35590 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ur){.  assert( s
355a0 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
355b0 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  Held(pCur->pBtre
355c0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
355d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
355e0 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c  te3BtreeMutexHel
355f0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
35600 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
35610 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43 75  );.  assert(!pCu
35620 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
35630 64 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28 21  dle);.  assert(!
35640 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
35650 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  ;.  pCur->isIncr
35660 62 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0a  blobHandle = 1;.
35670 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.