/ Hex Artifact Content
Login

Artifact 8b2294c64baeee6ae0519e1438c577fd601c02fb:


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 35 32 20 32 30 30 38 2f 30  c,v 1.452 2008/0
0190: 34 2f 32 34 20 31 39 3a 31 35 3a 31 30 20 73 68  4/24 19:15:10 sh
01a0: 61 6e 65 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20  ane Exp $.**.** 
01b0: 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d  This file implem
01c0: 65 6e 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20  ents a external 
01d0: 28 64 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74  (disk-based) dat
01e0: 61 62 61 73 65 20 75 73 69 6e 67 20 42 54 72 65  abase using BTre
01f0: 65 73 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  es..** See the h
0200: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
0210: 20 22 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f   "btreeInt.h" fo
0220: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
0230: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63  ormation..** Inc
0240: 6c 75 64 69 6e 67 20 61 20 64 65 73 63 72 69 70  luding a descrip
0250: 74 69 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72  tion of file for
0260: 6d 61 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76  mat and an overv
0270: 69 65 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  iew of operation
0280: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62  ..*/.#include "b
0290: 74 72 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  treeInt.h"../*.*
02a0: 2a 20 54 68 65 20 68 65 61 64 65 72 20 73 74 72  * The header str
02b0: 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
02c0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
02d0: 67 20 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51  g of every.** SQ
02e0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a  Lite database..*
02f0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
0300: 68 61 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72  har zMagicHeader
0310: 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45  [] = SQLITE_FILE
0320: 5f 48 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20  _HEADER;../*.** 
0330: 53 65 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20  Set this global 
0340: 76 61 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f  variable to 1 to
0350: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
0360: 75 73 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a  using the TRACE.
0370: 2a 2a 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  ** macro..*/.#if
0380: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 61   sqlite3BtreeTra
03a0: 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  ce=0;  /* True t
03b0: 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67  o enable tracing
03c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69   */.#endif....#i
03d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
03e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
03f0: 2a 0a 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69  *.** A flag to i
0400: 6e 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20  ndicate whether 
0410: 6f 72 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61  or not shared ca
0420: 63 68 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  che is enabled. 
0430: 20 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74   Also,.** a list
0440: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0450: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0460: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0470: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0480: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0490: 65 20 76 61 72 69 61 62 6c 65 73 20 68 61 76 65  e variables have
04a0: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
04b0: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
04c0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04d0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04e0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 73 65 20  to access these 
04f0: 76 61 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20  variables so we 
0500: 6d 61 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f  make them.** glo
0510: 62 61 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69  bal for test bui
0520: 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  lds..*/.#ifdef S
0530: 51 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61  QLITE_TEST.BtSha
0540: 72 65 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72  red *sqlite3Shar
0550: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
0560: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72  .int sqlite3Shar
0570: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0580: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
0590: 20 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74   BtShared *sqlit
05a0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05b0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  t = 0;.static in
05c0: 74 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  t sqlite3SharedC
05d0: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b  acheEnabled = 0;
05e0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f  .#endif.#endif /
05f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
0600: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
0610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0620: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0630: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
0640: 64 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72  disable the shar
0650: 65 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68  ed pager and sch
0660: 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a  ema features..**
0670: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0680: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f   has no effect o
0690: 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
06a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
06b0: 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63  .** The shared c
06c0: 61 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66  ache setting eff
06d0: 65 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65  ects only future
06e0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
06f0: 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c  ite3_open(), sql
0700: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f  ite3_open16(), o
0710: 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
0720: 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  2()..*/.int sqli
0730: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
0740: 64 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62  d_cache(int enab
0750: 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68  le){.  sqlite3Sh
0760: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
0770: 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74   = enable;.  ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
0790: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
07a0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
07b0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
07c0: 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
07d0: 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c 42 74 43  (Btree*,Pgno,BtC
07e0: 75 72 73 6f 72 2a 29 3b 0a 0a 0a 23 69 66 64 65  ursor*);...#ifde
07f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0800: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
0810: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
0820: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
0830: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
0840: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
0850: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
09c0: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
09d0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
09e0: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
09f0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0a00: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
0a10: 54 61 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66  Tables(a).#endif
0a20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0a30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0a40: 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  HE./*.** Query t
0a50: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
0a60: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
0a70: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
0a80: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
0a90: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
0aa0: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
0ab0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0ac0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
0ad0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
0ae0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
0af0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
0b00: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
0b10: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
0b20: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
0b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
0b40: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
0b50: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
0b60: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
0b70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
0b80: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
0b90: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
0ba0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
0bb0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
0bc0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
0bd0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61  no-op if the sha
0be0: 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74  red-cache is not
0bf0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
0c00: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  ( !p->sharable )
0c10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
0c20: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
0c30: 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  * If some other 
0c40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
0c50: 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  lding an exclusi
0c60: 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a  ve lock, the.  *
0c70: 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  * requested lock
0c80: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61   may not be obta
0c90: 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ined..  */.  if(
0ca0: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
0cb0: 20 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73   && pBt->pExclus
0cc0: 69 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65  ive!=p ){.    re
0cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
0ce0: 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ED;.  }..  /* Th
0cf0: 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c  is (along with l
0d00: 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77  ockTable()) is w
0d10: 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63  here the ReadUnc
0d20: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
0d30: 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
0d40: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
0d50: 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20  is querying for 
0d60: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20  a read-lock and 
0d70: 74 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a  the flag is.  **
0d80: 20 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f   set, it is unco
0d90: 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e  nditionally gran
0da0: 74 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68  ted - even if th
0db0: 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f  ere are write-lo
0dc0: 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  cks.  ** on the 
0dd0: 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74  table. If a writ
0de0: 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e-lock is reques
0df0: 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63  ted, the ReadUnc
0e00: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20  ommitted flag.  
0e10: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
0e20: 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ered..  **.  ** 
0e30: 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b  In function lock
0e40: 54 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65  Table(), if a re
0e50: 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e  ad-lock is deman
0e60: 64 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ded and the .  *
0e70: 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  * ReadUncommitte
0e80: 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e  d flag is set, n
0e90: 6f 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64  o entry is added
0ea0: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69   to the locks li
0eb0: 73 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72  st .  ** (BtShar
0ec0: 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a  ed.pLock)..  **.
0ed0: 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a    ** To summariz
0ee0: 65 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e  e: If the ReadUn
0ef0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
0f00: 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64  s set, then read
0f10: 20 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a   cursors do.  **
0f20: 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72   not create or r
0f30: 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63  espect table loc
0f40: 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  ks. The locking 
0f50: 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20  procedure for a 
0f60: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73  .  ** write-curs
0f70: 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  or does not chan
0f80: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  ge..  */.  if( .
0f90: 20 20 20 20 21 70 2d 3e 64 62 20 7c 7c 20 0a 20      !p->db || . 
0fa0: 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c     0==(p->db->fl
0fb0: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
0fc0: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a  ncommitted) || .
0fd0: 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45      eLock==WRITE
0fe0: 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61  _LOCK ||.    iTa
0ff0: 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  b==MASTER_ROOT. 
1000: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
1010: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1020: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1030: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1040: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1050: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
1060: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a  Table==iTab && .
1070: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
1080: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c  ->eLock!=eLock |
1090: 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f  | eLock!=READ_LO
10a0: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  CK) ){.        r
10b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
10c0: 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
10d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
10f0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
1100: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1110: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1120: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1130: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CACHE./*.** Add 
1140: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
1150: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
1160: 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65  ge iTable to the
1170: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73   shared-btree us
1180: 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68  ed.** by Btree h
1190: 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74  andle p. Paramet
11a0: 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er eLock must be
11b0: 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43   either READ_LOC
11c0: 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c  K or .** WRITE_L
11d0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
11e0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11f0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
1200: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
1210: 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ly. SQLITE_BUSY 
1220: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  and.** SQLITE_NO
1230: 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  MEM may also be 
1240: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1250: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c  tic int lockTabl
1260: 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
1270: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1280: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1290: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
12a0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
12b0: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
12c0: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
12d0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
12e0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f  Mutex(p) );..  /
12f0: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
1300: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
1310: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
1320: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
1330: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
1340: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1350: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  OK;.  }..  asser
1360: 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75  t( SQLITE_OK==qu
1370: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
1380: 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29  iTable, eLock) )
1390: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72  ;..  /* If the r
13a0: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
13b0: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
13c0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72  a read-lock is r
13d0: 65 71 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72  equested,.  ** r
13e0: 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68  eturn early with
13f0: 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e  out adding an en
1400: 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68 61  try to the BtSha
1410: 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20  red.pLock list. 
1420: 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74  See.  ** comment
1430: 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65   in function que
1440: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f  ryTableLock() fo
1450: 72 20 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68  r more info on h
1460: 61 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68  andling .  ** th
1470: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
1480: 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69  d flag..  */.  i
1490: 66 28 20 0a 20 20 20 20 28 70 2d 3e 64 62 29 20  f( .    (p->db) 
14a0: 26 26 20 0a 20 20 20 20 28 70 2d 3e 64 62 2d 3e  && .    (p->db->
14b0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
14c0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26  dUncommitted) &&
14d0: 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45   .    (eLock==RE
14e0: 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20  AD_LOCK) &&.    
14f0: 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52  iTable!=MASTER_R
1500: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  OOT.  ){.    ret
1510: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1520: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73   }..  /* First s
1530: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
1540: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
1550: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
1560: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
1570: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1580: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1590: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
15a0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
15b0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
15c0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
15d0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
15e0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
15f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1600: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
1610: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
1620: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
1630: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
1640: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
1650: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
1660: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
1670: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
1680: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
1690: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
16a0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
16b0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
16c0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
16d0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
16e0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
16f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1700: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
1710: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
1720: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
1730: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
1740: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
1750: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
1760: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
1770: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1780: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
1790: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
17a0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
17b0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
17c0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
17d0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
17e0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
17f0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
1800: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
1810: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
1820: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
1830: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
1840: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
1850: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
1860: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
1870: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
1880: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
1890: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
18a0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
18b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18c0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
18d0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
18e0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
18f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1900: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
1910: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
1920: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
1930: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
1940: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74 68   via calls to th
1950: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a 2a  e lockTable().**
1960: 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64   procedure) held
1970: 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65   by Btree handle
1980: 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   p..*/.static vo
1990: 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  id unlockAllTabl
19a0: 65 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  es(Btree *p){.  
19b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19c0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
19d0: 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74   **ppIter = &pBt
19e0: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65  ->pLock;..  asse
19f0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1a00: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1a10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
1a20: 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70  arable || 0==*pp
1a30: 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65  Iter );..  while
1a40: 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20  ( *ppIter ){.   
1a50: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
1a60: 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73   *ppIter;.    as
1a70: 73 65 72 74 28 20 70 42 74 2d 3e 70 45 78 63 6c  sert( pBt->pExcl
1a80: 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d  usive==0 || pBt-
1a90: 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 70 4c 6f  >pExclusive==pLo
1aa0: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
1ab0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
1ac0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1ad0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
1ae0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1af0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b  lite3_free(pLock
1b00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b10: 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c      ppIter = &pL
1b20: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
1b30: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
1b40: 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 70 20  ->pExclusive==p 
1b50: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 45 78 63  ){.    pBt->pExc
1b60: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 7d 0a  lusive = 0;.  }.
1b70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1b80: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b90: 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ACHE */..static 
1ba0: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
1bb0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1bc0: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  ;  /* Forward re
1bd0: 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a  ference */../*.*
1be0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1bf0: 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61  e cursor holds a
1c00: 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
1c10: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65  Shared.*/.#ifnde
1c20: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
1c30: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
1c40: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
1c50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1c60: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c70: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
1c80: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
1c90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1ca0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76  CRBLOB./*.** Inv
1cb0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
1cc0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1cd0: 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20  ache for cursor 
1ce0: 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  pCur, if any..*/
1cf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
1d00: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1d10: 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70  ache(BtCursor *p
1d20: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
1d30: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1d40: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
1d50: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61  te3_free(pCur->a
1d60: 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75  Overflow);.  pCu
1d70: 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30  r->aOverflow = 0
1d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  ;.}../*.** Inval
1d90: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
1da0: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1db0: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
1dc0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
1dd0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
1de0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
1df0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
1e00: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e10: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
1e20: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
1e30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
1e40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1e60: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
1e70: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1e80: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1e90: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
1ea0: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
1eb0: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1ec0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
1ed0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
1ee0: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
1ef0: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1f00: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
1f10: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
1f20: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
1f30: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
1f40: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
1f50: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
1f60: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
1f70: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
1f80: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
1f90: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
1fa0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
1fb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
1fc0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
1fd0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1fe0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
1ff0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
2000: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
2010: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
2020: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2030: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
2040: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2050: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
2060: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
2070: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2080: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
2090: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
20a0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
20b0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
20c0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
20d0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
20e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
20f0: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
2100: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
2110: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
2120: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
2130: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
2140: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
2150: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
2160: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
2170: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
2180: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
2190: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
21a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67  && 0==pCur->pPag
21c0: 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20  e->intKey){.    
21d0: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c  void *pKey = sql
21e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 43 75 72  ite3_malloc(pCur
21f0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  ->nKey);.    if(
2200: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72   pKey ){.      r
2210: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2220: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75  Key(pCur, 0, pCu
2230: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
2240: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2250: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2260: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
2270: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
2280: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2290: 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
22a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
22d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
22e0: 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
22f0: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
2300: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
2310: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2320: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
2330: 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
2340: 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b  pCur->pPage = 0;
2350: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2360: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
2370: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69  RESEEK;.  }..  i
2380: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
2390: 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
23a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23b0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
23c0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
23d0: 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45 78  rsors except pEx
23e0: 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65  cept open on the
23f0: 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20   table .** with 
2400: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
2410: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
2420: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
2430: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
2440: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
2450: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
2460: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
2470: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
2480: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
2490: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
24a0: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
24b0: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
24c0: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
24d0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
24e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2500: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2510: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
2520: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
2530: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
2540: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2550: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2560: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
2570: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
2580: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
2590: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
25a0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
25b0: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
25c0: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
25d0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
25e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
25f0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
2600: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2620: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2630: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2640: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
2650: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2670: 64 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  d clearCursorPos
2680: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
2690: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
26a0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
26b0: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
26c0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
26d0: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
26e0: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
26f0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2700: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
2710: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
2720: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
2730: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
2740: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
2750: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
2760: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
2770: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
2780: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
2790: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
27a0: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
27b0: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
27c0: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
27d0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
27e0: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
27f0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
2800: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 4f 72  ective restoreOr
2810: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2820: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
2830: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
2840: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
2850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
2860: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 72 67  ond argument arg
2870: 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65 6b 20 2d  ument - doSeek -
2880: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
2890: 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a 2a 20 72  instead of .** r
28a0: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 63 75 72  eturning the cur
28b0: 73 6f 72 20 74 6f 20 69 74 73 20 73 61 76 65 64  sor to its saved
28c0: 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 79 20 73   position, any s
28d0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 73  aved position is
28e0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
28f0: 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2900: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 49   set to CURSOR_I
2910: 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 69 6e 74 20 73  NVALID..*/.int s
2920: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
2930: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2940: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
2950: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
2960: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
2970: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2980: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2990: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
29a0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29b0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
29c0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29d0: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
29e0: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
29f0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2a00: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2a10: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49  .  if( pCur->isI
2a20: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 29 7b  ncrblobHandle ){
2a30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a40: 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
2a50: 6e 64 69 66 0a 20 20 70 43 75 72 2d 3e 65 53 74  ndif.  pCur->eSt
2a60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2a70: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ALID;.  rc = sql
2a80: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
2a90: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
2aa0: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
2ab0: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29   0, &pCur->skip)
2ac0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ad0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2ae0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
2af0: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
2b00: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
2b10: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b20: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2b30: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2b40: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2b50: 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  D );.  }.  retur
2b60: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
2b70: 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2b80: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
2b90: 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e   \.  (p->eState>
2ba0: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
2bb0: 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20  EEK ? \.        
2bc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73   sqlite3BtreeRes
2bd0: 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2be0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
2bf0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
2c00: 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53 51  _OK)..#ifndef SQ
2c10: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2c20: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
2c30: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
2c40: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
2c50: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
2c60: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
2c70: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
2c80: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
2c90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2ca0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
2cb0: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
2cc0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  er..*/.static Pg
2cd0: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
2ce0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
2cf0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
2d00: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
2d10: 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  e, iPtrMap, ret;
2d20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2d40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
2d50: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
2d60: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
2d70: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
2d80: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
2d90: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
2da0: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
2db0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
2dc0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
2dd0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
2de0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2df0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
2e00: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
2e10: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
2e20: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
2e30: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
2e40: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
2e50: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
2e60: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
2e70: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
2e80: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
2e90: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
2ea0: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
2eb0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
2ec0: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
2ed0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
2ee0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
2ef0: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
2f00: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
2f10: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2f20: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
2f30: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
2f40: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
2f50: 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  ent){.  DbPage *
2f60: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
2f70: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
2f80: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
2f90: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
2fa0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
2fb0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
2fc0: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
2fd0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
2fe0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
2ff0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
3000: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
3010: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
3020: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
3030: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3040: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3050: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
3060: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
3070: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
3080: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
3090: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
30a0: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
30b0: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
30c0: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
30d0: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
30e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
30f0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
3100: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
3110: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3120: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
3130: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
3140: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
3150: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
3160: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
3170: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
3180: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
3190: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
31b0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
31c0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
31d0: 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b  FFSET(pBt, key);
31e0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
31f0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
3200: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
3210: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
3220: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
3230: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
3240: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
3250: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
3260: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
3270: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
3280: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
3290: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72   parent));.    r
32a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32b0: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
32c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
32e0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
32f0: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
3300: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
3310: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
3320: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
3330: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
3340: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72  ef(pDbPage);.  r
3350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3360: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
3370: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
3380: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
3390: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
33a0: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
33b0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
33c0: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
33d0: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
33e0: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
33f0: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
3400: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
3410: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
3420: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
3430: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
3440: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
3450: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
3460: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
3470: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
3480: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
3490: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
34a0: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
34b0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
34c0: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
34d0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
34e0: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
34f0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
3500: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
3510: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
3520: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3530: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
3540: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
3550: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
3560: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
3570: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
3580: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3590: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
35a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
35b0: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
35c0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
35d0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
35e0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
35f0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
3600: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
3610: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
3620: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
3630: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
3640: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
3650: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
3660: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
3670: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
3680: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73  pBt, key);.  ass
3690: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
36a0: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
36b0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
36c0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
36d0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
36e0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
36f0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
3700: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
3710: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
3720: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
3730: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
3740: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
3750: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3760: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
3770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
3780: 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
3790: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
37a0: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
37b0: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
37c0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
37d0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
37e0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
37f0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
3800: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
3810: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
3820: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
3830: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
3840: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
3850: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
3860: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
3870: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
3880: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  ne findCell(pPag
3890: 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28 28  e, iCell) \.  ((
38a0: 70 50 61 67 65 29 2d 3e 61 44 61 74 61 20 2b 20  pPage)->aData + 
38b0: 67 65 74 32 62 79 74 65 28 26 28 70 50 61 67 65  get2byte(&(pPage
38c0: 29 2d 3e 61 44 61 74 61 5b 28 70 50 61 67 65 29  )->aData[(pPage)
38d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28  ->cellOffset+2*(
38e0: 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66 64 65 66  iCell)])).#ifdef
38f0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 75 38 20   SQLITE_TEST.u8 
3900: 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e  *sqlite3BtreeFin
3910: 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  dCell(MemPage *p
3920: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
3930: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c  {.  assert( iCel
3940: 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l>=0 );.  assert
3950: 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79 74 65  ( iCell<get2byte
3960: 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
3970: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
3980: 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  3]) );.  return 
3990: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
39a0: 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  iCell);.}.#endif
39b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
39c0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
39d0: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ion of sqlite3Bt
39e0: 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20 74 68  reeFindCell() th
39f0: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
3a00: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f  pages that do co
3a10: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
3a20: 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72  ells.  See inser
3a30: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  t.*/.static u8 *
3a40: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
3a50: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
3a60: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69   int iCell){.  i
3a70: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
3a80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3a90: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
3aa0: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
3ab0: 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  =pPage->nOverflo
3ac0: 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  w-1; i>=0; i--){
3ad0: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
3ae0: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
3af0: 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76   *pOvfl;.    pOv
3b00: 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76  fl = &pPage->aOv
3b10: 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70  fl[i];.    k = p
3b20: 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69  Ovfl->idx;.    i
3b30: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
3b40: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
3b50: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
3b60: 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c  urn pOvfl->pCell
3b70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3b80: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
3b90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
3ba0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
3bb0: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
3bc0: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
3bd0: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
3be0: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
3bf0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
3c00: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
3c10: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
3c20: 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65  unction.  sqlite
3c30: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
3c40: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
3c50: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
3c60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
3c70: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
3c80: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a  ParseCellPtr() .
3c90: 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  ** takes a point
3ca0: 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  er to the body o
3cb0: 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74  f the cell as it
3cc0: 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  s second argumen
3cd0: 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  t..**.** Within 
3ce0: 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70  this file, the p
3cf0: 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f  arseCell() macro
3d00: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69   can be called i
3d10: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c  nstead of.** sql
3d20: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3d30: 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73  llPtr(). Using s
3d40: 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74  ome compilers, t
3d50: 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74  his will be fast
3d60: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
3d70: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3d80: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
3d90: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
3da0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
3db0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
3dc0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
3de0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
3df0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
3e00: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
3e10: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
3e20: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3e30: 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  ){.  int n;     
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e50: 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20  Number bytes in 
3e60: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61  cell content hea
3e70: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  der */.  u32 nPa
3e80: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
3e90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
3ea0: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
3eb0: 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  oad */..  assert
3ec0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3ed0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
3ee0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49  >mutex) );..  pI
3ef0: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
3f00: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
3f10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
3f20: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
3f30: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
3f40: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
3f50: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
3f60: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
3f70: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
3f80: 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  a ){.    n += ge
3f90: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
3fa0: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
3fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61    }else{.    nPa
3fc0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  yload = 0;.  }. 
3fd0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
3fe0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28 20  nPayload;.  if( 
3ff0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
4000: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
4010: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
4020: 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  u64 *)&pInfo->nK
4030: 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
4040: 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20 2b    u32 x;.    n +
4050: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
4060: 43 65 6c 6c 5b 6e 5d 2c 20 78 29 3b 0a 20 20 20  Cell[n], x);.   
4070: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78   pInfo->nKey = x
4080: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  ;.    nPayload +
4090: 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  = x;.  }.  pInfo
40a0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
40b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
40c0: 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69  nHeader = n;.  i
40d0: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
40e0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
40f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
4100: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
4110: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
4120: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
4130: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
4140: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
4150: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
4160: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
4170: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
4180: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
4190: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
41a0: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
41b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
41c0: 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  al = nPayload;. 
41d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
41e0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69  low = 0;.    nSi
41f0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
4200: 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  n;.    if( nSize
4210: 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  <4 ){.      nSiz
4220: 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a  e = 4;        /*
4230: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
4240: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d  ze is 4 */.    }
4250: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
4260: 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  e = nSize;.  }el
4270: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
4280: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
4290: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
42a0: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
42b0: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
42c0: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
42d0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
42e0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
42f0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
4300: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
4310: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
4320: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
4330: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
4340: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
4350: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
4360: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
4370: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
4380: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
4390: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
43a0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
43b0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
43c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
43d0: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
43e0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
43f0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
4400: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
4410: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
4420: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
4430: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
4440: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
4450: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
4460: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
4470: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
4480: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
4490: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
44a0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
44b0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
44c0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
44d0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
44e0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
44f0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
4500: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
4510: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
4520: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
4530: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
4540: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
4550: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
4560: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
4570: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
4580: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
4590: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
45a0: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
45b0: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
45c0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
45d0: 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20  al = surplus;.  
45e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
45f0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d  Info->nLocal = m
4600: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
4610: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
4620: 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  low = pInfo->nLo
4630: 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  cal + n;.    pIn
4640: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
4650: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
4660: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
4670: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
4680: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c   iCell, pInfo) \
4690: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
46a0: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
46b0: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
46c0: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
46d0: 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73   (pInfo)).void s
46e0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
46f0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
4700: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
4710: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
4720: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
4730: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
4740: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4750: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
4760: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
4770: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
4780: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
4790: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
47a0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
47b0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
47c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
47d0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
47e0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
47f0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
4800: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
4810: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
4820: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
4830: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
4840: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
4850: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
4860: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
4870: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
4880: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
4890: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
48a0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
48b0: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
48c0: 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  er..*/.#ifndef N
48d0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36  DEBUG.static u16
48e0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
48f0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
4900: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
4910: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
4920: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
4930: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e  Page, iCell, &in
4940: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
4950: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  fo.nSize;.}.#end
4960: 69 66 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  if.static u16 ce
4970: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
4980: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
4990: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
49a0: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
49b0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
49c0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
49d0: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
49e0: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a   info.nSize;.}..
49f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4a00: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
4a10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
4a20: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
4a30: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
4a40: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
4a50: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
4a60: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
4a70: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
4a80: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
4a90: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
4aa0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
4ab0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
4ac0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4ad0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4ae0: 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a 20    if( pCell ){. 
4af0: 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
4b00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
4b10: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
4b20: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
4b30: 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
4b40: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
4b50: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
4b60: 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
4b70: 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
4b80: 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
4b90: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4ba0: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
4bb0: 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
4bc0: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
4bd0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
4be0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
4bf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74 72        return ptr
4c00: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
4c10: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
4c20: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
4c30: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
4c40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4c50: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
4c60: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
4c70: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
4c80: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
4c90: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
4ca0: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
4cb0: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
4cc0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
4cd0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
4ce0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
4cf0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
4d00: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
4d10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4d20: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
4d30: 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72   *pCell;.  asser
4d40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4d50: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
4d60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43  ->mutex) );.  pC
4d70: 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ell = findOverfl
4d80: 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  owCell(pPage, iC
4d90: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ell);.  return p
4da0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
4db0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d  pPage, pCell);.}
4dc0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4dd0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
4de0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
4df0: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
4e00: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
4e10: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
4e20: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
4e30: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
4e40: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
4e50: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
4e60: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
4e70: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
4e80: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
4e90: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
4ea0: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
4eb0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
4ec0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
4ed0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
4f00: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4f30: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
4f40: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4f60: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
4f70: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
4f80: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
4f90: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4fb0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
4fc0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
4fd0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4ff0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
5000: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
5010: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5020: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
5030: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
5040: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
5050: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
5060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
5070: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
5080: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
5090: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
50a0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
50b0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
50c0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
50d0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
50e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
50f0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
5100: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
5110: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
5120: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
5130: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
5140: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
5150: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
5160: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
5170: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
5180: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5190: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
51a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
51b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
51c0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
51d0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
51e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
51f0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
5200: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
5210: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
5220: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
5230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5240: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5250: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
5260: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
5270: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
5280: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
5290: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
52a0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
52b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
52c0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
52d0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
52e0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
52f0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
5300: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
5310: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
5320: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
5330: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
5340: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72  usableSize;.  br
5350: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
5360: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
5370: 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c  mcpy(&temp[brk],
5380: 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
5390: 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a  bleSize - brk);.
53a0: 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69    brk = usableSi
53b0: 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ze;.  for(i=0; i
53c0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
53d0: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
53e0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
53f0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
5400: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
5410: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
5420: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
5430: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
5440: 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67 65  assert( pc<pPage
5450: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5460: 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  e );.    size = 
5470: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
5480: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
5490: 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a     brk -= size;.
54a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
54b0: 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  [brk], &temp[pc]
54c0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
54d0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b  2byte(pAddr, brk
54e0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
54f0: 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74   brk>=cellOffset
5500: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
5510: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5520: 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74  +5], brk);.  dat
5530: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
5540: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
5550: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
5560: 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c   0;.  addr = cel
5570: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
5580: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
5590: 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64  addr], 0, brk-ad
55a0: 64 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  dr);.  return SQ
55b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
55c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
55d0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
55e0: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
55f0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
5600: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
5610: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
5620: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
5630: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
5640: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
5650: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
5660: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
5670: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
5680: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
5690: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
56a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
56b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
56c0: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
56d0: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
56e0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
56f0: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
5700: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
5710: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
5720: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
5730: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
5740: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
5750: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
5760: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
5770: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
5780: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
5790: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
57a0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
57b0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
57c0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
57d0: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
57e0: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
57f0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
5800: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
5810: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
5820: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
5830: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
5840: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
5850: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
5860: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
5870: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
5880: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5890: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
58a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
58b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
58c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
58d0: 6e 42 79 74 65 3c 34 20 29 20 6e 42 79 74 65 20  nByte<4 ) nByte 
58e0: 3d 20 34 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 4;.  if( pPage
58f0: 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c  ->nFree<nByte ||
5900: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
5910: 77 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  w>0 ) return 0;.
5920: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
5930: 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d  = nByte;.  hdr =
5940: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
5950: 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61  t;..  nFrag = da
5960: 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28  ta[hdr+7];.  if(
5970: 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20   nFrag<60 ){.   
5980: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66   /* Search the f
5990: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
59a0: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
59b0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
59c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63   the.    ** spac
59d0: 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20  e request. */.  
59e0: 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a    addr = hdr+1;.
59f0: 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d      while( (pc =
5a00: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5a10: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
5a20: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
5a30: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
5a40: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
5a50: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
5a60: 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65    if( size<nByte
5a70: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +4 ){.          
5a80: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64  memcpy(&data[add
5a90: 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32  r], &data[pc], 2
5aa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  );.          dat
5ab0: 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67  a[hdr+7] = nFrag
5ac0: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5ad0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ae0: 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  n pc;.        }e
5af0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
5b00: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
5b10: 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29  +2], size-nByte)
5b20: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5b30: 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e  rn pc + size - n
5b40: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Byte;.        }.
5b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64        }.      ad
5b60: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20  dr = pc;.    }. 
5b70: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
5b80: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
5b90: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
5ba0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
5bb0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
5bc0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
5bd0: 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74  t area..  */.  t
5be0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
5bf0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e  ata[hdr+5]);.  n
5c00: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
5c10: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
5c20: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
5c30: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
5c40: 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30  .  if( nFrag>=60
5c50: 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b   || cellOffset +
5c60: 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d   2*nCell > top -
5c70: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69 66   nByte ){.    if
5c80: 28 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  ( defragmentPage
5c90: 28 70 50 61 67 65 29 20 29 20 72 65 74 75 72 6e  (pPage) ) return
5ca0: 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65   0;.    top = ge
5cb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5cc0: 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20  +5]);.  }.  top 
5cd0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  -= nByte;.  asse
5ce0: 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  rt( cellOffset +
5cf0: 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20   2*nCell <= top 
5d00: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
5d10: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
5d20: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
5d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5d40: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
5d50: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
5d60: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
5d70: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
5d80: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
5d90: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
5da0: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
5db0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
5dc0: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
5dd0: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
5de0: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
5df0: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
5e00: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
5e10: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
5e20: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
5e30: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
5e40: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
5e50: 69 63 20 76 6f 69 64 20 66 72 65 65 53 70 61 63  ic void freeSpac
5e60: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
5e70: 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74  , int start, int
5e80: 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64   size){.  int ad
5e90: 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b  dr, pbegin, hdr;
5ea0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5eb0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
5ec0: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
5ed0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
5ee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5ef0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
5f00: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
5f10: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
5f20: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
5f30: 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61  hdrOffset+6+(pPa
5f40: 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b  ge->leaf?0:4) );
5f50: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
5f60: 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65  t + size)<=pPage
5f70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5f80: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
5f90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5fa0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
5fb0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 73 69  tex) );.  if( si
5fc0: 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b  ze<4 ) size = 4;
5fd0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5fe0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
5ff0: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
6000: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
6010: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
6020: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
6030: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
6040: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
6050: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
6060: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
6070: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
6080: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
6090: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
60a0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
60b0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
60c0: 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61  s */.  hdr = pPa
60d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
60e0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
60f0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
6100: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6110: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
6120: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
6130: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6140: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
6150: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
6160: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6170: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
6180: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6190: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  }.  assert( pbeg
61a0: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
61b0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
61c0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
61d0: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
61e0: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
61f0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
6200: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
6210: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
6220: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
6230: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
6240: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
6250: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65  e->nFree += size
6260: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
6270: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
6280: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
6290: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
62a0: 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  et + 1;.  while(
62b0: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
62c0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
62d0: 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  )>0 ){.    int p
62e0: 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20  next, psize;.   
62f0: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
6300: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  addr );.    asse
6310: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
6320: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6330: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
6340: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
6350: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
6360: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
6370: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
6380: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
6390: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
63a0: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
63b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
63c0: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
63d0: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
63e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72 61       assert( fra
63f0: 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  g<=data[pPage->h
6400: 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20  drOffset+7] );. 
6410: 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d       data[pPage-
6420: 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d  >hdrOffset+7] -=
6430: 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74   frag;.      put
6440: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6450: 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64  in], get2byte(&d
6460: 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20  ata[pnext]));.  
6470: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
6480: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e  ta[pbegin+2], pn
6490: 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64 61  ext+get2byte(&da
64a0: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65  ta[pnext+2])-pbe
64b0: 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gin);.    }else{
64c0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
64d0: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
64e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
64f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
6500: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
6510: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
6520: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
6530: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
6540: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
6550: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
6560: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
6570: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
6580: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6590: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
65a0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
65b0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
65c0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
65d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
65e0: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
65f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
6600: 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  op + get2byte(&d
6610: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b  ata[pbegin+2]));
6620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
6630: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
6640: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
6650: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
6660: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
6670: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
6680: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
6690: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
66a0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
66b0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f  static void deco
66c0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
66d0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
66e0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
66f0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
6700: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
6710: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
6720: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
6730: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
6740: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
6750: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6760: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6770: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6780: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e  ) );.  pPage->in
6790: 74 4b 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65  tKey = (flagByte
67a0: 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50   & (PTF_INTKEY|P
67b0: 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30  TF_LEAFDATA))!=0
67c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44  ;.  pPage->zeroD
67d0: 61 74 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20  ata = (flagByte 
67e0: 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21  & PTF_ZERODATA)!
67f0: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61  =0;.  pPage->lea
6800: 66 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  f = (flagByte & 
6810: 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20  PTF_LEAF)!=0;.  
6820: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
6830: 69 7a 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e  ize = 4*(pPage->
6840: 6c 65 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20  leaf==0);.  pBt 
6850: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
6860: 69 66 28 20 66 6c 61 67 42 79 74 65 20 26 20 50  if( flagByte & P
6870: 54 46 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20  TF_LEAFDATA ){. 
6880: 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
6890: 74 61 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ta = 1;.    pPag
68a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
68b0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
68c0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
68d0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
68e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
68f0: 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30  ge->leafData = 0
6900: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
6910: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
6920: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
6930: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6940: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->minLocal;.  }.
6950: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
6960: 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f   = !(pPage->zero
6970: 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d  Data || (!pPage-
6980: 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e  >leaf && pPage->
6990: 6c 65 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f  leafData));.}../
69a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
69b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
69c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
69d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
69e0: 2a 20 54 68 65 20 70 50 61 72 65 6e 74 20 70 61  * The pParent pa
69f0: 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
6a00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6a10: 20 4d 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a   MemPage which.*
6a20: 2a 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  * is the parent 
6a30: 6f 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  of the page bein
6a40: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  g initialized.  
6a50: 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a  The root of a.**
6a60: 20 42 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61   BTree has no pa
6a70: 72 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20  rent and so for 
6a80: 74 68 61 74 20 70 61 67 65 2c 20 70 50 61 72 65  that page, pPare
6a90: 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  nt==NULL..**.** 
6aa0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
6ab0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
6ac0: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
6ad0: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
6ae0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
6af0: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
6b00: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
6b10: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
6b20: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
6b30: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
6b40: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
6b50: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
6b60: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
6b70: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
6b80: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
6b90: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
6ba0: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
6bb0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ption..*/.int sq
6bc0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
6bd0: 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
6be0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
6bf0: 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 69  The page to be i
6c00: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
6c10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
6c20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
6c30: 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  rent.  Might be 
6c40: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
6c50: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
6c60: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
6c70: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
6c80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
6c90: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
6ca0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
6cb0: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
6cc0: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
6cd0: 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
6ce0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
6cf0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
6d00: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
6d10: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
6d20: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
6d30: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75  cture */.  int u
6d40: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
6d50: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
6d60: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
6d70: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
6d80: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
6d90: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
6da0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
6db0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
6dc0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
6dd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6de0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
6df0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
6e00: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
6e10: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
6e20: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
6e30: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
6e40: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
6e50: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
6e60: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
6e70: 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c  t( pParent==0 ||
6e80: 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70   pParent->pBt==p
6e90: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
6ea0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6eb0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6ed0: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
6ee0: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
6ef0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
6f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6f10: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
6f20: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
6f30: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6f40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
6f50: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
6f60: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
6f70: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
6f80: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
6f90: 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20  ent!=pParent && 
6fa0: 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21  (pPage->pParent!
6fb0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49  =0 || pPage->isI
6fc0: 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nit) ){.    /* T
6fd0: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  he parent page s
6fe0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e  hould never chan
6ff0: 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  ge unless the fi
7000: 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f  le is corrupt */
7010: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7020: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7030: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7040: 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  ->isInit ) retur
7050: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
7060: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
7070: 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  t==0 && pParent!
7080: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  =0 ){.    pPage-
7090: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
70a0: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  nt;.    sqlite3P
70b0: 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
70c0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
70d0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
70e0: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
70f0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
7100: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7110: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
7120: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
7130: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
7140: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
7150: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
7160: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
7170: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
7180: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
7190: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
71a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
71b0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
71c0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
71d0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
71e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
71f0: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
7200: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
7210: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
7220: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
7230: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
7240: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
7250: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
7260: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7270: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7280: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  }.  if( pPage->n
7290: 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
72a0: 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt!=0 && pParent
72b0: 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
72c0: 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75   /* All pages mu
72d0: 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  st have at least
72e0: 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70   one cell, excep
72f0: 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73  t for root pages
7300: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
7310: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7320: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  PT;.  }..  /* Co
7330: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
7340: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
7350: 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d  e page */.  pc =
7360: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7370: 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
7380: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
7390: 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73   top - (cellOffs
73a0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
73b0: 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ell);.  while( p
73c0: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  c>0 ){.    int n
73d0: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
73e0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
73f0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  -4 ){.      /* F
7400: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
7410: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
7420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7430: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
7440: 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d      }.    next =
7450: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7460: 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  pc]);.    size =
7470: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7480: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
7490: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
74a0: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
74b0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
74c0: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
74d0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
74e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
74f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7500: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72  ; .    }.    nFr
7510: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ee += size;.    
7520: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20  pc = next;.  }. 
7530: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
7540: 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72  nFree;.  if( nFr
7550: 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ee>=usableSize )
7560: 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70  {.    /* Free sp
7570: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
7580: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
7590: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
75a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
75b0: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61  KPT; .  }..  pPa
75c0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
75d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
75e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
75f0: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
7600: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
7610: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
7620: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
7630: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
7640: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
7650: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
7660: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
7670: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7680: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
7690: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
76a0: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
76b0: 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20  Bt;.  int hdr = 
76c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
76d0: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a  ;.  int first;..
76e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
76f0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
7700: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7710: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
7720: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7730: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
7740: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7750: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
7760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7770: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7780: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7790: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
77a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
77b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
77c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
77d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
77e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
77f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d  t->mutex) );.  m
7800: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
7810: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
7820: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64  Size - hdr);.  d
7830: 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73  ata[hdr] = flags
7840: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
7850: 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26  + 8 + 4*((flags&
7860: 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20  PTF_LEAF)==0);. 
7870: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
7880: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
7890: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
78a0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
78b0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
78c0: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
78d0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
78e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
78f0: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
7900: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
7910: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
7920: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
7930: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
7940: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
7950: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
7960: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
7970: 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ft = 0;.  pPage-
7980: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
7990: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
79a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
79b0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
79c0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
79d0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
79e0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
79f0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
7a00: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
7a10: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
7a20: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
7a30: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
7a40: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
7a50: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
7a60: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
7a70: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
7a80: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
7a90: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
7aa0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
7ab0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
7ac0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
7ad0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
7ae0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
7af0: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
7b00: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
7b10: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
7b20: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
7b30: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
7b40: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
7b50: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
7b60: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
7b70: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
7b80: 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
7b90: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
7ba0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
7bb0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
7bc0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
7bd0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
7be0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
7bf0: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
7c00: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
7c10: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
7c20: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
7c30: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
7c40: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
7c50: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7c60: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
7c70: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
7c80: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
7c90: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
7ca0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
7cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7cc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7cd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7cf0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
7d00: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
7d10: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
7d20: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
7d30: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7d40: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
7d50: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
7d60: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
7d70: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
7d80: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
7d90: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7da0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
7db0: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
7dc0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
7dd0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
7de0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
7df0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
7e00: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
7e10: 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50   100 : 0;.  *ppP
7e20: 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72  age = pPage;.  r
7e30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
7e50: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
7e60: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
7e70: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
7e80: 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20  tine.** is just 
7e90: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
7ea0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
7eb0: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  arate calls to.*
7ec0: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  * sqlite3BtreeGe
7ed0: 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69  tPage() and sqli
7ee0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
7ef0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
7f00: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
7f10: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
7f20: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
7f30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7f40: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7f60: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
7f70: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
7f80: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
7f90: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
7fa0: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
7fb0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
7fc0: 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61  Parent     /* Pa
7fd0: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
7fe0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7ff0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8000: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8010: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
8020: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
8030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8040: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
8050: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
8060: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
8070: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
8080: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
8090: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
80a0: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
80b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
80c0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
80d0: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
80e0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
80f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8100: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
8110: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
8120: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
8130: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
8140: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
8150: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
8160: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
8170: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
8180: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
8190: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
81a0: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
81b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
81c0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
81d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
81e0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
81f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
8200: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
8210: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
8220: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8230: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
8240: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
8250: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
8260: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8270: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8280: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
8290: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
82a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
82b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
82c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
82d0: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
82e0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
82f0: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
8300: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
8310: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
8320: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
8330: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
8340: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
8350: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
8360: 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  r(DbPage *pData,
8370: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
8380: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8390: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
83a0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
83b0: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
83c0: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
83d0: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
83e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
83f0: 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ge->isInit==0 ||
8400: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8410: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8420: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8430: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29  pPage->pParent )
8440: 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
8450: 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
8460: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 61 73 73  pParent;.    ass
8470: 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 42  ert( pParent->pB
8480: 74 3d 3d 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t==pPage->pBt );
8490: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
84a0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ent = 0;.    rel
84b0: 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74  easePage(pParent
84c0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
84d0: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  isInit = 0;.}../
84e0: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
84f0: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
8500: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
8510: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
8520: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
8530: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
8540: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
8550: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
8560: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
8570: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
8580: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
8590: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
85a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
85b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
85c0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
85d0: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
85e0: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
85f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
8600: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
8610: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
8620: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
8630: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
8640: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  t(DbPage *pData,
8650: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
8660: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8670: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
8680: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
8690: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
86a0: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
86b0: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
86c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
86d0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
86e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
86f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8700: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8710: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
8720: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8730: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
8740: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
8750: 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rent);.  }.}../*
8760: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
8770: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
8780: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
8790: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74  ic int sqlite3Bt
87a0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
87b0: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c  dler(void *pArg,
87c0: 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61   int n){.  BtSha
87d0: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
87e0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
87f0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
8800: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8810: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8820: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
8830: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8840: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
8850: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
8860: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
8870: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
8880: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
8890: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
88a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
88b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
88c0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
88d0: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
88e0: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
88f0: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
8900: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
8910: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
8920: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
8930: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
8940: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
8950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
8960: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
8970: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
8980: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
8990: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
89a0: 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
89b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
89c0: 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
89d0: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
89e0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
89f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8a00: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
8a10: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
8a20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
8a30: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
8a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
8a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
8a60: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
8a70: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
8a80: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
8a90: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8aa0: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
8ab0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
8ac0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ae0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
8af0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
8b00: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
8b10: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
8b20: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
8b30: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
8b40: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
8b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
8b60: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
8b70: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
8b80: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
8b90: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
8ba0: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
8bb0: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
8bc0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
8bd0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
8be0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
8bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8c00: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20   int nReserve;. 
8c10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
8c20: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a  DbHeader[100];..
8c30: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
8c40: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
8c50: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
8c60: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
8c70: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
8c80: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
8c90: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
8ca0: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
8cb0: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
8cc0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
8cd0: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
8ce0: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
8cf0: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
8d00: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
8d10: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
8d20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8d30: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
8d40: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
8d50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8d60: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
8d70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8d80: 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  YDB.    const in
8d90: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20  t isMemdb = 0;. 
8da0: 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74   #else.    const
8db0: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a   int isMemdb = z
8dc0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72  Filename && !str
8dd0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
8de0: 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65  :memory:");.  #e
8df0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ndif.#endif..  a
8e00: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
8e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8e20: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8e30: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56  >mutex) );..  pV
8e40: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
8e50: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
8e60: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
8e70: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
8e80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8e90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8ea0: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
8eb0: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
8ec0: 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64  db = db;..#if !d
8ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8ee0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
8ef0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
8f00: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
8f10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
8f20: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
8f30: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
8f40: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
8f50: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
8f60: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
8f70: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
8f80: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
8f90: 2a 2f 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  */.  if( (flags 
8fa0: 26 20 42 54 52 45 45 5f 50 52 49 56 41 54 45 29  & BTREE_PRIVATE)
8fb0: 3d 3d 30 0a 20 20 20 26 26 20 69 73 4d 65 6d 64  ==0.   && isMemd
8fc0: 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e  b==0.   && (db->
8fd0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
8fe0: 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46  tab)==0.   && zF
8ff0: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
9000: 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20  name[0].  ){.   
9010: 20 69 66 28 20 73 71 6c 69 74 65 33 53 68 61 72   if( sqlite3Shar
9020: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
9030: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
9040: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
9050: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
9060: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
9070: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 28 63 68 61  lPathname = (cha
9080: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
9090: 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  oc(nFullPathname
90a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
90b0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
90c0: 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  red;.      p->sh
90d0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
90e0: 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
90f0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
9100: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
9110: 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  che;.      }.   
9120: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
9130: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
9140: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9150: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9160: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9180: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
9190: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
91a0: 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  me, nFullPathnam
91b0: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
91c0: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
91d0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ared = sqlite3_m
91e0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
91f0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
9200: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
9210: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9220: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
9230: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 73 71        for(pBt=sq
9240: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
9250: 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d 70  List; pBt; pBt=p
9260: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
9270: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
9280: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
9290: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
92a0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
92b0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
92c0: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
92d0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
92e0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
92f0: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
9300: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
9310: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
9320: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
9330: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
9340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9360: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
9370: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
9380: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
9390: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
93a0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
93b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
93c0: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
93d0: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
93e0: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
93f0: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
9400: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
9410: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
9420: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
9430: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
9440: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
9450: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
9460: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
9470: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
9480: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
9490: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
94a0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
94b0: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
94c0: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
94d0: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
94e0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
94f0: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
9500: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
9510: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
9520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
9530: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
9540: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
9550: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
9560: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
9570: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
9580: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
9590: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
95a0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
95b0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
95c0: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
95d0: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
95e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
95f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
9600: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
9610: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
9620: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
9630: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
9640: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
9650: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
9660: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
9670: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
9680: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
9690: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
96a0: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
96b0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
96c0: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
96d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
96e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
96f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9700: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
9710: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
9720: 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64 72      pBt->busyHdr
9730: 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  .xFunc = sqlite3
9740: 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  BtreeInvokeBusyH
9750: 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42 74 2d  andler;.    pBt-
9760: 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20 3d 20  >busyHdr.pArg = 
9770: 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  pBt;.    rc = sq
9780: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
9790: 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
97a0: 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
97d0: 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
97e0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
97f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9800: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9810: 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
9820: 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
9830: 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
9840: 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
9850: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
9860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9870: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
9880: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
9890: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
98a0: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
98b0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
98c0: 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20 20 70  >busyHdr);.    p
98d0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
98e0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
98f0: 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70 42  SetDestructor(pB
9900: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 44  t->pPager, pageD
9910: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
9920: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
9930: 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61  einiter(pBt->pPa
9940: 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ger, pageReinit)
9950: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  ;.    pBt->pCurs
9960: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
9970: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
9980: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
9990: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
99a0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
99b0: 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ger);.    pBt->p
99c0: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
99d0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36  te(&zDbHeader[16
99e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ]);.    if( pBt-
99f0: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
9a00: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
9a10: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
9a20: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
9a30: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
9a40: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
9a50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
9a60: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
9a70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
9a80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
9a90: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9aa0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9ab0: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
9ac0: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
9ad0: 32 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42 74  25% */.      pBt
9ae0: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
9af0: 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20   32;   /* 12.5% 
9b00: 2a 2f 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  */.      pBt->mi
9b10: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
9b20: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
9b30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9b40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
9b50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
9b60: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
9b70: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
9b80: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9b90: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
9ba0: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
9bb0: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
9bc0: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
9bd0: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
9be0: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
9bf0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
9c00: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
9c10: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
9c20: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
9c30: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9c40: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
9c50: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
9c60: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
9c70: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
9c80: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
9c90: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
9ca0: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
9cb0: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
9cc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9cd0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
9ce0: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
9cf0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
9d00: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
9d10: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
9d20: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
9d30: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
9d40: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
9d50: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
9d60: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
9d70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
9d80: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
9d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
9da0: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
9db0: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
9dc0: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
9dd0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d   = zDbHeader[21]
9de0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e  ;.      pBt->min
9df0: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
9e00: 65 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 20  eader[22];.     
9e10: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
9e20: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 33  c = zDbHeader[23
9e30: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
9e40: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
9e50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
9e70: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
9e80: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
9e90: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
9ea0: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
9eb0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
9ec0: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
9ed0: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
9ee0: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
9ef0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  if.    }.    pBt
9f00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
9f10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
9f20: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
9f30: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
9f40: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
9f50: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
9f60: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
9f70: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
9f80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
9f90: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9fa0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9fb0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9fc0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9fd0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
9fe0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9ff0: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
a000: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
a010: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
a020: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
a030: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
a040: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a050: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
a060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a070: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
a080: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
a090: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
a0a0: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
a0b0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
a0c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
a0d0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
a0e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
a0f0: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
a100: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
a110: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
a120: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a130: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
a140: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
a150: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
a160: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a170: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
a180: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
a190: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
a1a0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
a1b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a1c0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a1d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
a1e0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
a1f0: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71   pBt->pNext = sq
a200: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a210: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
a220: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a230: 73 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  st = pBt;.      
a240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a250: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
a260: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a270: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
a280: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a290: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
a2a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a2b0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
a2c0: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
a2d0: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
a2e0: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
a2f0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
a300: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
a310: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
a320: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
a330: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
a340: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
a350: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
a360: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
a370: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
a380: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
a390: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
a3a0: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
a3b0: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
a3c0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
a3d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
a3e0: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
a3f0: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
a400: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
a410: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
a420: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
a430: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
a440: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
a450: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
a460: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
a470: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
a480: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
a490: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
a4a0: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
a4b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a4c0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
a4d0: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
a4e0: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
a4f0: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
a500: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
a510: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
a520: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a530: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
a540: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
a550: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
a560: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
a570: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
a580: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
a590: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
a5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a5b0: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
a5c0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
a5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a5e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a5f0: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
a600: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
a610: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
a620: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a630: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
a640: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
a650: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
a660: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
a670: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a680: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
a690: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a6a0: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
a6b0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
a6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a6d0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
a6e0: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
a6f0: 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
a700: 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
a710: 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
a720: 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
a730: 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
a740: 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
a750: 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
a760: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
a770: 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
a780: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
a790: 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
a7a0: 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
a7b0: 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
a7c0: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
a7d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
a7e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a7f0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a800: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a810: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53   *pMaster;.  BtS
a820: 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
a830: 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
a840: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a850: 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
a860: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
a870: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  .  pMaster = sql
a880: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
a890: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
a8a0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
a8b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a8c0: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
a8d0: 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
a8e0: 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
a8f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
a900: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a910: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
a920: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a930: 68 65 4c 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e  heList = pBt->pN
a940: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
a950: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
a960: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a970: 4c 69 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c  List;.      whil
a980: 65 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  e( pList && pLis
a990: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
a9a0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
a9b0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
a9c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a9d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
a9e0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
a9f0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
aa00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
aa10: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
aa20: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
aa30: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
aa40: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
aa50: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
aa60: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
aa70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
aa80: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
aa90: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
aaa0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
aab0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
aac0: 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
aad0: 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
aae0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
aaf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
ab00: 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
ab10: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
ab20: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
ab30: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
ab40: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
ab50: 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
ab60: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
ab70: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
ab80: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ab90: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
aba0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
abb0: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
abc0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75  b = p->db;.  pCu
abd0: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
abe0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
abf0: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
ac00: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
ac10: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
ac20: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
ac30: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
ac40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ac50: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
ac60: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
ac70: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
ac80: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
ac90: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
aca0: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
acb0: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
acc0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
acd0: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
ace0: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
acf0: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
ad00: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
ad10: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
ad20: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
ad30: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
ad40: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
ad50: 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
ad60: 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
ad70: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
ad80: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
ad90: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
ada0: 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
adb0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
adc0: 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
add0: 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
ade0: 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
adf0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
ae00: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
ae10: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
ae20: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
ae30: 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
ae40: 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
ae50: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
ae60: 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
ae70: 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
ae80: 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
ae90: 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
aea0: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
aeb0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
aec0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
aed0: 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
aee0: 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
aef0: 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
af00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
af10: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
af20: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
af30: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
af40: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
af50: 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
af60: 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
af70: 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
af80: 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
af90: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
afa0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e  lite3_free(pBt->
afb0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
afc0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e  lite3_free(pBt->
afd0: 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
afe0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
aff0: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
b000: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
b010: 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
b020: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
b030: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b040: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
b050: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
b060: 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
b070: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
b080: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
b090: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b0a0: 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
b0b0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
b0c0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
b0d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b0e0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
b0f0: 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
b100: 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
b110: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
b120: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
b130: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
b140: 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
b150: 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
b160: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
b170: 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
b180: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
b190: 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
b1a0: 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
b1b0: 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
b1c0: 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
b1d0: 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
b1e0: 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
b1f0: 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
b200: 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
b210: 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
b220: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
b230: 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
b240: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
b250: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
b260: 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
b270: 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
b280: 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
b290: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
b2a0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
b2b0: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
b2c0: 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
b2d0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
b2e0: 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
b2f0: 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
b300: 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
b310: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
b320: 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
b330: 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
b340: 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
b350: 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
b360: 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
b370: 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
b380: 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
b390: 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
b3a0: 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
b3b0: 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
b3c0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
b3d0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
b3e0: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
b3f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b400: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b410: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b420: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
b430: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
b440: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
b450: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
b460: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
b470: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
b480: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b490: 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
b4a0: 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
b4b0: 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
b4c0: 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
b4d0: 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
b4e0: 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
b4f0: 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
b500: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
b510: 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
b520: 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
b530: 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
b540: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
b550: 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
b560: 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
b570: 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
b580: 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
b590: 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
b5a0: 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
b5b0: 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
b5c0: 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
b5d0: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b5e0: 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
b5f0: 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
b600: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
b610: 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
b620: 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
b630: 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
b640: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
b650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
b660: 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
b670: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
b680: 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
b690: 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
b6a0: 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
b6b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b6c0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
b6d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b6e0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
b6f0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
b700: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
b710: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
b720: 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
b730: 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
b740: 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69  ullSync);.  sqli
b750: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
b760: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
b770: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
b780: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
b790: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
b7a0: 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
b7b0: 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
b7c0: 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
b7d0: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
b7e0: 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
b7f0: 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
b800: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
b810: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
b820: 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
b830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
b850: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
b860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b870: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b880: 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74  );  .  sqlite3Bt
b890: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
b8a0: 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
b8b0: 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
b8c0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
b8d0: 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
b8e0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
b8f0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
b900: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
b910: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b920: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
b930: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
b940: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
b950: 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
b960: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
b970: 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
b980: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
b990: 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
b9a0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
b9b0: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
b9c0: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
b9d0: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
b9e0: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
b9f0: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
ba00: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
ba10: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
ba20: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
ba30: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
ba40: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
ba50: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
ba60: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
ba70: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
ba80: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
ba90: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
baa0: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
bab0: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
bac0: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
bad0: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
bae0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
baf0: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
bb00: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
bb10: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
bb20: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
bb30: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
bb40: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
bb50: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
bb60: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
bb70: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
bb80: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
bb90: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
bba0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
bbb0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
bbc0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
bbd0: 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
bbe0: 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
bbf0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bc00: 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
bc10: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
bc20: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
bc30: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
bc40: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
bc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
bc60: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
bc70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
bc80: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
bc90: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
bca0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
bcb0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
bcc0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
bcd0: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
bce0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
bcf0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
bd00: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
bd10: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
bd20: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
bd30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
bd40: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
bd50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
bd60: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
bd70: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
bd80: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
bd90: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
bda0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
bdb0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
bdc0: 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
bdd0: 63 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ce = 0;.    rc =
bde0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
bdf0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
be00: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
be10: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
be20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
be30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
be40: 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69 74  Reserve;.  sqlit
be50: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
be60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
be70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
be80: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
be90: 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
bea0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
beb0: 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
bec0: 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
bed0: 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
bee0: 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
bef0: 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
bf00: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
bf10: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
bf20: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
bf30: 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
bf40: 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
bf50: 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
bf60: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
bf70: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
bf80: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
bf90: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
bfa0: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
bfb0: 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
bfc0: 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
bfd0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
bfe0: 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
bff0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
c000: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
c010: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
c020: 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
c030: 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
c040: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c050: 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
c060: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
c070: 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
c080: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c090: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
c0a0: 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
c0b0: 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
c0c0: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
c0d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c0e0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c0f0: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
c100: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c110: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
c120: 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
c130: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
c140: 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
c150: 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
c160: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
c170: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
c180: 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
c190: 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
c1a0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
c1b0: 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
c1c0: 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
c1d0: 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
c1e0: 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
c1f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
c200: 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
c210: 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
c220: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
c230: 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
c240: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
c250: 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
c260: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
c270: 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
c280: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
c290: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
c2a0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
c2b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
c2c0: 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
c2d0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
c2e0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
c2f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c300: 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f 56   int av = (autoV
c310: 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20 73  acuum?1:0);..  s
c320: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c330: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
c340: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26  pageSizeFixed &&
c350: 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61   av!=pBt->autoVa
c360: 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
c370: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
c380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c390: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
c3a0: 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   av;.  }.  sqlit
c3b0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c3c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
c3d0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
c3e0: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
c3f0: 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
c400: 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
c410: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
c420: 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
c430: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
c440: 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
c450: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
c460: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
c470: 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
c480: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
c490: 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
c4a0: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
c4b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
c4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c4d0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
c4e0: 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
c4f0: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
c500: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
c510: 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
c520: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
c530: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
c540: 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
c550: 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
c560: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
c570: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c580: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
c590: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
c5a0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
c5b0: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
c5c0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
c5d0: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
c5e0: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
c5f0: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
c600: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
c610: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
c620: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
c630: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
c640: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
c650: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
c660: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
c670: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
c680: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
c690: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
c6a0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
c6b0: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
c6c0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
c6d0: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
c6e0: 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
c6f0: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
c700: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
c710: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
c720: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
c730: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c740: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c750: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
c760: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
c770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c790: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
c7a0: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
c7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c7c0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c7d0: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
c7e0: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
c7f0: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
c800: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
c810: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
c820: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
c830: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c  .  */.  rc = SQL
c840: 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66  ITE_NOTADB;.  if
c850: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
c860: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
c870: 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  ger)>0 ){.    in
c880: 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
c890: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
c8a0: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
c8b0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
c8c0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
c8d0: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
c8e0: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
c8f0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
c900: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
c910: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
c920: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
c930: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
c940: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c950: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
c960: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
c970: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
c980: 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
c990: 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
c9a0: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
c9b0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
c9c0: 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67  eSize)!=0 || pag
c9d0: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20  eSize<512 ||.   
c9e0: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58       (SQLITE_MAX
c9f0: 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38  _PAGE_SIZE<32768
ca00: 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   && pageSize>SQL
ca10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ca20: 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  E).    ){.      
ca30: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
ca40: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
ca50: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
ca60: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
ca70: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
ca80: 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
ca90: 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61  [20];.    if( pa
caa0: 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
cab0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
cac0: 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
cad0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
cae0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
caf0: 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
cb00: 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
cb10: 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
cb20: 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
cb30: 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
cb40: 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
cb50: 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
cb60: 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
cb70: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
cb80: 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
cb90: 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
cba0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
cbb0: 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
cbc0: 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
cbd0: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
cbe0: 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
cbf0: 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
cc00: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
cc10: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
cc20: 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
cc30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
cc40: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
cc50: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
cc60: 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
cc70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cc80: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
cc90: 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
cca0: 70 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  pace = 0;.      
ccb0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
ccc0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
ccd0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
cce0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
ccf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cd00: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
cd10: 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
cd20: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
cd30: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
cd40: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
cd50: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
cd60: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
cd70: 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
cd80: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d  ;.    pBt->maxEm
cd90: 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b  bedFrac = page1[
cda0: 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  21];.    pBt->mi
cdb0: 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  nEmbedFrac = pag
cdc0: 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[22];.    pBt-
cdd0: 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 70  >minLeafFrac = p
cde0: 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65  age1[23];.#ifnde
cdf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ce00: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
ce10: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
ce20: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
ce30: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
ce40: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
ce50: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ce60: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
ce70: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
ce80: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
ce90: 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
cea0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
ceb0: 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
cec0: 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
ced0: 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
cee0: 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
cef0: 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
cf00: 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
cf10: 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
cf20: 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
cf30: 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
cf40: 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
cf50: 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
cf60: 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
cf70: 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
cf80: 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
cf90: 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
cfa0: 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
cfb0: 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
cfc0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
cfd0: 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
cfe0: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
cff0: 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
d000: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
d010: 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
d020: 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
d030: 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
d040: 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
d050: 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
d060: 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
d070: 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
d080: 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
d090: 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
d0a0: 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
d0b0: 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
d0c0: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
d0d0: 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
d0e0: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
d0f0: 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 61  Size-12)*pBt->ma
d100: 78 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d  xEmbedFrac/255 -
d110: 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
d120: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
d130: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
d140: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 2f 32 35  >minEmbedFrac/25
d150: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
d160: 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
d170: 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
d180: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
d190: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
d1a0: 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61  -12)*pBt->minLea
d1b0: 66 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  fFrac/255 - 23;.
d1c0: 20 20 69 66 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f    if( pBt->minLo
d1d0: 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  cal>pBt->maxLoca
d1e0: 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  l || pBt->maxLoc
d1f0: 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  al<0 ){.    goto
d200: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
d210: 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ed;.  }.  assert
d220: 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
d230: 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
d240: 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
d250: 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
d260: 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
d270: 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
d280: 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
d290: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
d2a0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
d2b0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
d2c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
d2d0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
d2e0: 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ike lockBtree() 
d2f0: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61  except that it a
d300: 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  lso invokes the.
d310: 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ** busy callback
d320: 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63   if there is loc
d330: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f  k contention..*/
d340: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
d350: 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42  BtreeWithRetry(B
d360: 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69  tree *pRef){.  i
d370: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d380: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
d390: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
d3a0: 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20  utex(pRef) );.  
d3b0: 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e  if( pRef->inTran
d3c0: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
d3d0: 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61  .    u8 inTransa
d3e0: 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42  ction = pRef->pB
d3f0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
d400: 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  ;.    btreeInteg
d410: 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20  rity(pRef);.    
d420: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d430: 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66  eBeginTrans(pRef
d440: 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e  , 0);.    pRef->
d450: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
d460: 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69  on = inTransacti
d470: 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e  on;.    pRef->in
d480: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
d490: 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  NE;.    if( rc==
d4a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4b0: 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54     pRef->pBt->nT
d4c0: 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
d4d0: 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74    }.    btreeInt
d4e0: 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
d4f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
d500: 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  .       ../*.** 
d510: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
d520: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
d530: 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
d540: 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
d550: 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
d560: 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
d570: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
d580: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
d590: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
d5a0: 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
d5b0: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
d5c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
d5d0: 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
d5e0: 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
d5f0: 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
d600: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
d610: 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74  re are any outst
d620: 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20  anding cursors, 
d630: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d640: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
d650: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
d660: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
d670: 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
d680: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
d690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
d6a0: 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
d6b0: 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
d6c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
d6d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d6e0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d6f0: 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
d700: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
d710: 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73  NE && pBt->pCurs
d720: 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50  or==0 && pBt->pP
d730: 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69  age1!=0 ){.    i
d740: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f( sqlite3PagerR
d750: 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
d760: 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20  ger)>=1 ){.     
d770: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
d780: 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23  age1->aData );.#
d790: 69 66 20 30 0a 20 20 20 20 20 20 69 66 28 20 70  if 0.      if( p
d7a0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
d7b0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
d7c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
d7d0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
d7e0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61        pPage->aDa
d7f0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
d800: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
d810: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
d820: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
d830: 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  Bt;.        pPag
d840: 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  e->pgno = 1;.   
d850: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d860: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
d870: 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
d880: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  }.    pBt->pPage
d890: 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  1 = 0;.    pBt->
d8a0: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
d8b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d8c0: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62  a new database b
d8d0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
d8e0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
d8f0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f   the.** file..*/
d900: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
d910: 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
d920: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
d930: 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
d940: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
d950: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
d960: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d970: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
d980: 78 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  x) );.  if( sqli
d990: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
d9a0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30  t(pBt->pPager)>0
d9b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d9c0: 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74  _OK;.  pP1 = pBt
d9d0: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
d9e0: 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
d9f0: 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
da00: 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
da10: 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
da20: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
da30: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
da40: 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
da50: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
da60: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
da70: 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
da80: 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
da90: 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
daa0: 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
dab0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
dac0: 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
dad0: 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
dae0: 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42  .  data[20] = pB
daf0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
db00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
db10: 20 64 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d   data[21] = pBt-
db20: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20  >maxEmbedFrac;. 
db30: 20 64 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d   data[22] = pBt-
db40: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20  >minEmbedFrac;. 
db50: 20 64 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d   data[23] = pBt-
db60: 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20  >minLeafFrac;.  
db70: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
db80: 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
db90: 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
dba0: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
dbb0: 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
dbc0: 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
dbd0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
dbe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dbf0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
dc00: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
dc10: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
dc20: 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
dc30: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
dc40: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
dc50: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
dc60: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
dc70: 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
dc80: 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
dc90: 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
dca0: 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
dcb0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
dcc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
dcd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dce0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
dcf0: 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
dd00: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
dd10: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
dd20: 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
dd30: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
dd40: 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
dd50: 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
dd60: 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
dd70: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
dd80: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
dd90: 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
dda0: 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
ddb0: 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
ddc0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
ddd0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
dde0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
ddf0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
de00: 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
de10: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
de20: 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
de30: 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
de40: 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
de50: 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
de60: 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
de70: 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
de80: 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
de90: 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
dea0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
deb0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
dec0: 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
ded0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
dee0: 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
def0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
df00: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
df10: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
df20: 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
df30: 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
df40: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
df50: 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
df60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
df70: 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
df80: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
df90: 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
dfa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
dfb0: 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
dfc0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
dfd0: 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
dfe0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
dff0: 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
e000: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e010: 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
e020: 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
e030: 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
e040: 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
e050: 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
e060: 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
e070: 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
e080: 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
e090: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
e0a0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
e0b0: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
e0c0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e0d0: 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
e0e0: 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
e0f0: 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
e100: 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
e110: 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
e120: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e130: 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
e140: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
e150: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
e160: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
e170: 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
e180: 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
e190: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
e1a0: 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
e1b0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
e1c0: 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
e1d0: 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
e1e0: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
e1f0: 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
e200: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
e210: 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
e220: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
e230: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
e240: 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
e250: 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
e260: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
e270: 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
e280: 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
e290: 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
e2a0: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
e2b0: 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
e2c0: 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
e2d0: 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
e2e0: 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
e2f0: 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
e300: 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
e310: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
e320: 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
e330: 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
e340: 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
e350: 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
e360: 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
e370: 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
e380: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
e390: 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
e3a0: 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
e3b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e3c0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
e3d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
e3e0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
e3f0: 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
e400: 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e  p->db;.  btreeIn
e410: 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
e420: 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
e430: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
e440: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
e450: 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
e460: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
e470: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
e480: 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
e490: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
e4a0: 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
e4b0: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
e4c0: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
e4d0: 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
e4e0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
e4f0: 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
e500: 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
e510: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
e520: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
e530: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
e540: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
e550: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
e560: 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
e570: 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
e580: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
e590: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
e5a0: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
e5b0: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  egun;.  }..  /* 
e5c0: 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
e5d0: 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
e5e0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
e5f0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e600: 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
e610: 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
e620: 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
e630: 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
e640: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
e650: 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
e660: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
e670: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  /.  if( pBt->inT
e680: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
e690: 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61  S_WRITE && wrfla
e6a0: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
e6b0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
e6c0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
e6d0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
e6e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
e6f0: 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72 66  _CACHE.  if( wrf
e700: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
e710: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
e720: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
e730: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
e740: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
e750: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
e760: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
e770: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e780: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
e790: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
e7a0: 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  un;.      }.    
e7b0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
e7c0: 64 6f 20 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  do {.    while( 
e7d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e7e0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
e7f0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
e800: 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20  ckBtree(pBt);.  
e810: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
e820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
e830: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
e840: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
e850: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e860: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e870: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e880: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e890: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
e8a0: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
e8b0: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
e8c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e8d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e8e0: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
e8f0: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
e900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e910: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
e920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e930: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
e940: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
e950: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e960: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
e970: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
e980: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
e990: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
e9a0: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
e9b0: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
e9c0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71   &&.          sq
e9d0: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
e9e0: 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2c  BusyHandler(pBt,
e9f0: 20 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63   0) );..  if( rc
ea00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ea10: 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
ea20: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
ea30: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
ea40: 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
ea50: 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
ea60: 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
ea70: 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
ea80: 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
ea90: 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
eaa0: 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
eab0: 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
eac0: 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
ead0: 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
eae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
eaf0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
eb00: 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
eb10: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
eb20: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 29 3b  t->pExclusive );
eb30: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 45 78 63  .      pBt->pExc
eb40: 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20 20 20 20  lusive = p;.    
eb50: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
eb60: 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74  rans_begun:.  bt
eb70: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
eb80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
eb90: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
eba0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
ebb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ebc0: 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
ebd0: 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
ebe0: 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
ebf0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
ec00: 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
ec10: 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
ec20: 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
ec30: 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
ec40: 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
ec50: 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
ec60: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
ec70: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
ec80: 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
ec90: 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
eca0: 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
ecb0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ece0: 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
ecf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ed20: 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
ed30: 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
ed40: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ed70: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
ed80: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ed90: 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72  ;.  int isInitOr
eda0: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
edb0: 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
edc0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
edd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ede0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
edf0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ee00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ee10: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
ee20: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
ee30: 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
ee40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ee50: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
ee60: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
ee70: 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
ee80: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
ee90: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
eea0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
eeb0: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
eec0: 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
eed0: 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
eee0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
eef0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
ef00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ef10: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
ef20: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
ef30: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
ef40: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
ef50: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
ef60: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
ef70: 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
ef80: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
ef90: 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
efa0: 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
efb0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
efc0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
efd0: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
efe0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
eff0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
f000: 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
f010: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
f020: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
f030: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
f040: 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
f050: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
f060: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
f070: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
f080: 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
f090: 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
f0a0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
f0b0: 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
f0c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f0d0: 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
f0e0: 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
f0f0: 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  renteed to be a 
f100: 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
f110: 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
f120: 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
f130: 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
f140: 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
f150: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
f160: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
f170: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
f180: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
f190: 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
f1a0: 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
f1b0: 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
f1c0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
f1d0: 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
f1e0: 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
f1f0: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
f200: 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
f230: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
f240: 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
f250: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
f260: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
f270: 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
f280: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
f290: 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
f2a0: 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
f2b0: 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
f2c0: 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
f2d0: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
f2e0: 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
f2f0: 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
f300: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
f310: 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
f330: 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
f340: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
f350: 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
f360: 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
f370: 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
f380: 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
f390: 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
f3a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f3b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
f3c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
f3d0: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
f3e0: 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
f3f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
f400: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
f410: 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
f420: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
f430: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
f440: 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
f450: 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
f460: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f470: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f480: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
f490: 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
f4a0: 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
f4b0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49  lse{.    int isI
f4c0: 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
f4d0: 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
f4e0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
f4f0: 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  l;..    sqlite3B
f500: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
f510: 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
f520: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
f530: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
f540: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
f550: 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
f560: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
f570: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
f580: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
f590: 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
f5a0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
f5b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f5c0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
f5d0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
f5e0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
f5f0: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
f600: 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
f610: 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
f620: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
f630: 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
f640: 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
f650: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
f660: 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
f670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
f680: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
f690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f6b0: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
f6c0: 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
f6d0: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
f6e0: 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
f6f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f710: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
f720: 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
f730: 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
f740: 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
f750: 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
f760: 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
f770: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
f780: 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
f790: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f7a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f7b0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
f7c0: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
f7d0: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
f7e0: 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
f7f0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
f800: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
f810: 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
f820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f830: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
f840: 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
f850: 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
f860: 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
f870: 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
f880: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
f890: 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
f8a0: 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
f8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f8c0: 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
f8d0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
f8f0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
f900: 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
f910: 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
f920: 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
f930: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f940: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
f950: 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
f960: 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
f970: 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
f980: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f990: 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
f9a0: 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
f9b0: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
f9c0: 65 65 50 61 67 65 20 20 20 20 20 20 20 20 20 20  eePage          
f9d0: 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
f9e0: 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
f9f0: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50   to */.){.  MemP
fa00: 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
fa10: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
fa20: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
fa30: 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
fa40: 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
fa50: 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
fa60: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
fa70: 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
fa80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
fa90: 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
faa0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
fab0: 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
fac0: 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
fad0: 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
fae0: 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
faf0: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
fb00: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
fb10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
fb20: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
fb30: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
fb40: 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
fb50: 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
fb60: 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
fb70: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
fb80: 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
fb90: 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
fba0: 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
fbb0: 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
fbc0: 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
fbd0: 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
fbe0: 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
fbf0: 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
fc00: 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
fc10: 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
fc20: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
fc30: 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
fc40: 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
fc50: 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  ePage);.  if( rc
fc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fc70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fc80: 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
fc90: 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
fca0: 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
fcb0: 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
fcc0: 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
fcd0: 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
fce0: 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
fcf0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
fd00: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
fd10: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
fd20: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
fd30: 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
fd40: 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
fd50: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
fd60: 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
fd70: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
fd80: 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
fd90: 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
fda0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
fdb0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
fdc0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
fdd0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
fde0: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
fdf0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
fe00: 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
fe10: 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
fe20: 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
fe30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
fe40: 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
fe50: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
fe60: 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
fe70: 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
fe80: 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
fe90: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fea0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
feb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
fec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
fed0: 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
fee0: 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
fef0: 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
ff00: 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
ff10: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
ff20: 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
ff30: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
ff40: 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b  OW2, iFreePage);
ff50: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
ff60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ff70: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ff90: 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
ffa0: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
ffb0: 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
ffc0: 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
ffd0: 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
ffe0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
fff0: 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
10000 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
10010 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
10020 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
10030 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
10040 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
10050 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
10060 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
10070 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
10080 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
10090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
100a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
100b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
100c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
100d0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
100e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
100f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
10110 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
10120 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
10130 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10140 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
10150 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
10160 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
10170 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
10180 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
10190 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
101a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
101b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
101c0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
101d0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
101e0 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
101f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10200 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
10210 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
10220 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
10230 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
10240 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
10250 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
10260 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
10270 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
10280 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
10290 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
102a0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
102b0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
102c0 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
102d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
102e0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
102f0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
10300 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
10310 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
10320 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
10330 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
10340 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
10350 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
10360 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
10370 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
10380 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
10390 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
103a0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
103b0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
103c0 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
103d0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
103e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
103f0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
10400 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
10410 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
10420 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
10430 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
10440 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
10450 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
10460 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
10470 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
10480 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
10490 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
104a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
104b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
104c0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
104d0 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
104e0 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
104f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10500 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
10510 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
10520 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f  no nFin){.  Pgno
10530 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20   iLastPg;       
10540 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
10550 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
10560 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72  se */.  Pgno nFr
10570 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
10580 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
10590 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
105a0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
105b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
105d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c  ->mutex) );.  iL
105e0 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72  astPg = pBt->nTr
105f0 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74  unc;.  if( iLast
10600 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  Pg==0 ){.    iLa
10610 73 74 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61  stPg = sqlite3Pa
10620 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
10630 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  ->pPager);.  }..
10640 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
10650 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
10660 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
10670 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
10680 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  (pBt) ){.    int
10690 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70   rc;.    u8 eTyp
106a0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
106b0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
106c0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
106d0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
106e0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
106f0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c  ( nFreeList==0 |
10700 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20  | nFin==iLastPg 
10710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10720 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10730 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
10740 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
10750 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
10760 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
10770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10780 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10790 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
107a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
107b0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
107c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
107d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
107e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
107f0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
10800 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
10810 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
10820 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
10830 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
10840 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
10850 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
10860 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
10870 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
10880 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
10890 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
108a0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
108b0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
108c0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
108d0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
108e0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
108f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
10900 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
10910 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
10920 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
10930 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10940 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
10950 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
10960 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
10970 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
10980 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
10990 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
109a0 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
109b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
109c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
109d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
109e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
109f0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10a00 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
10a10 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
10a20 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
10a30 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
10a40 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
10a50 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
10a60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
10a70 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
10a80 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
10a90 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
10aa0 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
10ab0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
10ac0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
10ad0 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
10ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10b00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10b10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10b20 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72  * If nFin is zer
10b30 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
10b40 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
10b50 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
10b60 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
10b70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
10b80 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
10b90 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
10ba0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
10bb0 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
10bc0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e  other hand, if n
10bd0 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74  Fin is greater t
10be0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
10bf0 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
10c00 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
10c10 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
10c20 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
10c30 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
10c40 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
10c50 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
10c60 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  */.      do {.  
10c70 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
10c80 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
10c90 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
10ca0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
10cb0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
10cc0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
10cd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
10cf0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
10d00 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
10d10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10d20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
10d30 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
10d40 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e  .      }while( n
10d50 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50  Fin!=0 && iFreeP
10d60 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
10d70 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
10d80 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
10d90 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c   .      rc = sql
10da0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
10db0 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29  LastPg->pDbPage)
10dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
10dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10de0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
10df0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
10e00 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
10e10 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b 0a  Page, iFreePg);.
10e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
10e30 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
10e40 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
10e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10e60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
10e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10e80 20 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75    }..  pBt->nTru
10e90 6e 63 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31  nc = iLastPg - 1
10ea0 3b 0a 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e  ;.  while( pBt->
10eb0 6e 54 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f  nTrunc==PENDING_
10ec0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c  BYTE_PAGE(pBt)||
10ed0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
10ee0 74 2c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20  t, pBt->nTrunc) 
10ef0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  ){.    pBt->nTru
10f00 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nc--;.  }.  retu
10f10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10f20 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
10f30 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
10f40 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
10f50 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
10f60 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
10f70 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
10f80 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
10f90 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
10fa0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
10fb0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
10fc0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
10fd0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
10fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
10ff0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
11000 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
11010 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
11020 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
11030 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a  rror occured,.**
11040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11050 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11060 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
11070 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
11080 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
11090 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
110a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
110b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
110c0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
110d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
110e0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
110f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11100 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11110 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
11120 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
11130 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
11140 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
11150 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11160 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
11170 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
11180 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
11190 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
111a0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
111b0 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  pBt, 0);.  }.  s
111c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
111d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
111e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
111f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11200 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
11210 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
11220 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
11230 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
11240 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
11250 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
11260 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
11270 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
11280 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
11290 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
112a0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
112b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
112c0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
112d0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
112e0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
112f0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
11300 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
11310 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
11320 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
11330 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
11340 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
11350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
11360 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
11370 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
11380 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20  no *pnTrunc){.  
11390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
113a0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
113b0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
113c0 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  r;.#ifndef NDEBU
113d0 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  G.  int nRef = s
113e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
113f0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e  unt(pPager);.#en
11400 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73  dif..  assert( s
11410 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11420 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11430 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
11440 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
11450 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
11460 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
11470 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
11480 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
11490 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20  o nFin = 0;..   
114a0 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
114b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ==0 ){.      Pgn
114c0 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 50  o nFree;.      P
114d0 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  gno nPtrmap;.   
114e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
114f0 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  z = pBt->pageSiz
11500 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4f  e;.      Pgno nO
11510 72 69 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rig = sqlite3Pag
11520 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
11530 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  >pPager);..     
11540 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
11550 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29  GE(pBt, nOrig) )
11560 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11570 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11580 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
11590 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50      if( nOrig==P
115a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
115b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
115c0 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20   nOrig--;.      
115d0 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
115e0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
115f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
11600 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70  );.      nPtrmap
11610 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
11620 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
11630 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35  t, nOrig)+pgsz/5
11640 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20  )/(pgsz/5);.    
11650 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
11660 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
11670 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69  ;.      if( nOri
11680 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
11690 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
116a0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  <=PENDING_BYTE_P
116b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
116c0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
116d0 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
116e0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
116f0 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
11700 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
11710 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11720 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
11730 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11740 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
11750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
11760 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
11770 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20  p(pBt, nFin);.  
11780 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
11790 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
117a0 20 20 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e       assert(nFin
117b0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75  ==0 || pBt->nTru
117c0 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70  nc==0 || nFin<=p
117d0 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20  Bt->nTrunc);.   
117e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
117f0 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  K;.      if( pBt
11800 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
11810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11820 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
11830 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
11840 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
11850 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11860 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
11870 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
11880 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
11890 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
118a0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e        pBt->nTrun
118b0 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  c = nFin;.      
118c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
118d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
118e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
118f0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
11900 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
11910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11920 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72  _OK ){.    *pnTr
11930 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  unc = pBt->nTrun
11940 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  c;.    pBt->nTru
11950 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  nc = 0;.  }.  as
11960 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
11970 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
11980 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
11990 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
119a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
119b0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
119c0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
119d0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
119e0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
119f0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
11a00 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
11a10 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
11a20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
11a30 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
11a40 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
11a50 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
11a60 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
11a70 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
11a80 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
11a90 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
11aa0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
11ab0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
11ac0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
11ad0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
11ae0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11af0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
11b00 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
11b10 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
11b20 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
11b30 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
11b40 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
11b50 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11b60 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
11b70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11b80 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
11b90 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
11ba0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
11bb0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
11bc0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
11bd0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
11be0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
11bf0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
11c00 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
11c10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
11c20 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
11c30 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
11c40 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f  BtreeCommit() fo
11c50 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
11c60 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
11c70 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
11c80 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
11c90 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
11ca0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
11cb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
11cc0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
11cd0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
11ce0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
11cf0 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
11d00 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
11d10 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
11d20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
11d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
11d40 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
11d50 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
11d60 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
11d70 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
11d80 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
11d90 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
11da0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
11db0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
11dc0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
11dd0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
11de0 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
11df0 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
11e00 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
11e10 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
11e20 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
11e30 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
11e40 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
11e50 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
11e60 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
11e70 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
11e80 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
11e90 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
11ea0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
11eb0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
11ec0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
11ed0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
11ee0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
11ef0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
11f00 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
11f10 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
11f20 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
11f30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11f40 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
11f50 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
11f60 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
11f70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11f80 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20      Pgno nTrunc 
11f90 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
11fa0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11fb0 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e     pBt->db = p->
11fc0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
11fd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11fe0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
11ff0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12000 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
12010 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26  uumCommit(pBt, &
12020 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20  nTrunc); .      
12030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
12050 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12060 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12070 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
12080 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
12090 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
120a0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
120b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
120c0 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b  ter, nTrunc, 0);
120d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
120e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
120f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12100 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
12110 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
12120 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
12130 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12140 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
12150 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
12160 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
12170 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
12180 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
12190 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
121a0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
121b0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
121c0 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
121d0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
121e0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
121f0 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
12200 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
12210 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
12220 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
12230 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
12240 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
12250 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
12260 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
12270 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
12280 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
12290 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
122a0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
122b0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
122c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
122d0 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
122e0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
122f0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
12300 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
12310 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
12320 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
12330 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
12340 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
12350 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
12360 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
12370 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
12380 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
12390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
123a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
123b0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
123c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
123d0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
123e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
123f0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
12400 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  >db;.  btreeInte
12410 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
12420 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
12430 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
12440 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
12450 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
12460 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
12470 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
12480 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
12490 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
124a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
124b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
124c0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
124d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
124e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
124f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
12500 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12510 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
12520 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12530 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
12540 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
12550 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
12560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12570 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12580 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12590 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
125a0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
125b0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
125c0 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69  READ;.    pBt->i
125d0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
125e0 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
125f0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
12600 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79  e handle has any
12610 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
12620 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
12630 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  ment the transac
12640 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20  tion.  ** count 
12650 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
12660 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
12670 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65  saction count re
12680 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a  aches 0, set.  *
12690 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  * the shared sta
126a0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
126b0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
126c0 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c  eIfUnused() call
126d0 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c   below.  ** will
126e0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
126f0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  r..  */.  if( p-
12700 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
12710 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d  NONE ){.    pBt-
12720 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
12730 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
12740 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
12750 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
12760 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
12770 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
12780 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
12790 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20  handles current 
127a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
127b0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
127c0 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20  and unlock.  ** 
127d0 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69  the pager if thi
127e0 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
127f0 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
12800 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12810 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72  ..  */.  p->inTr
12820 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12830 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
12840 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
12850 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12860 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
12870 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12890 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
128a0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
128b0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
128c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
128d0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
128e0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
128f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
12900 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12910 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
12920 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
12930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12940 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12950 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
12960 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
12970 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12990 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
129a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
129b0 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
129c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
129d0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
129e0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
129f0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
12a00 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
12a10 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
12a20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
12a30 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
12a40 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
12a50 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
12a60 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
12a70 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
12a80 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
12a90 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
12aa0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
12ab0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
12ac0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
12ad0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
12ae0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
12af0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
12b00 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
12b10 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
12b20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
12b30 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
12b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
12b50 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
12b60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
12b70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
12b80 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
12b90 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
12ba0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
12bb0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
12bc0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
12bd0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
12be0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
12bf0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
12c00 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
12c10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
12c20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
12c30 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
12c40 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
12c50 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
12c60 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
12c70 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
12c80 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
12c90 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
12ca0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
12cb0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
12cc0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
12cd0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
12ce0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
12cf0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
12d00 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
12d10 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
12d20 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
12d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12d40 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
12d50 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
12d60 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
12d70 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
12d80 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
12d90 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
12da0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
12db0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
12dc0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
12dd0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
12de0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
12df0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
12e00 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
12e10 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
12e20 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
12e30 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
12e40 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
12e50 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
12e60 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
12e70 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
12e80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12e90 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
12ea0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
12eb0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
12ec0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
12ed0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12ee0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
12ef0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
12f00 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
12f10 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
12f20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
12f30 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  ion(p);.    p->e
12f40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
12f50 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
12f60 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d  p = errCode;.  }
12f70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12f80 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
12f90 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
12fa0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12fb0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
12fc0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
12fd0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
12fe0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
12ff0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
13000 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
13010 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
13020 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
13030 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
13040 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
13050 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
13060 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
13070 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
13080 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13090 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
130a0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
130b0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
130c0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
130d0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
130e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
130f0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
13100 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13110 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13120 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
13130 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
13140 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13150 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
13160 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
13170 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
13180 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
13190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
131a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
131b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
131c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
131d0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
131e0 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
131f0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
13200 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a   occured whilst.
13210 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
13220 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
13230 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
13240 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
13250 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
13260 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
13270 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
13280 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
13290 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
132a0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
132b0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
132c0 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
132d0 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
132e0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
132f0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
13300 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
13310 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
13320 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
13330 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
13340 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
13350 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
13360 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
13370 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
13380 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
13390 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
133a0 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
133b0 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
133c0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
133d0 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54  p);.  unlockAllT
133e0 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28  ables(p);..  if(
133f0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
13400 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
13410 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65  int rc2;..#ifnde
13420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13430 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
13440 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65  ->nTrunc = 0;.#e
13450 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
13460 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
13470 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13480 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
13490 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
134a0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
134b0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
134c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
134d0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
134e0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
134f0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
13500 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
13510 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
13520 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
13530 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
13540 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
13550 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
13560 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
13570 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
13580 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
13590 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
135a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
135b0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
135c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
135d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
135e0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
135f0 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
13600 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
13610 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
13620 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
13630 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
13640 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
13650 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
13660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
13670 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
13680 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
13690 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
136a0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
136b0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
136c0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
136d0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
136e0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
136f0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
13700 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74  RANS_NONE;.  pBt
13710 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
13720 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
13730 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
13740 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13750 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13760 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13770 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
13780 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
13790 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
137a0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
137b0 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62  ion can.** can b
137c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  e rolled back in
137d0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
137e0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
137f0 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74  ion..** You must
13800 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
13810 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72  tion before star
13820 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
13830 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75  ction..** The su
13840 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
13850 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
13860 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20  lly if the main 
13870 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63  transaction.** c
13880 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
13890 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  back..**.** Only
138a0 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74   one subtransact
138b0 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76  ion may be activ
138c0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74  e at a time.  It
138d0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
138e0 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20  try.** to start 
138f0 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63  a new subtransac
13900 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20  tion if another 
13910 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
13920 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
13930 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
13940 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
13950 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
13960 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
13970 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
13980 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
13990 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
139a0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
139b0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
139c0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
139d0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
139e0 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
139f0 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
13a00 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
13a10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
13a20 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
13a30 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
13a40 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
13a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13a60 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
13a70 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13a80 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13a90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13aa0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13ab0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
13ac0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
13ad0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
13ae0 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
13af0 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72  >inStmt ){.    r
13b00 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
13b10 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
13b20 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
13b30 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
13b40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
13b50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13b60 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
13b70 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
13b80 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ly ? SQLITE_OK :
13b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13ba0 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  tBegin(pBt->pPag
13bb0 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
13bc0 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Stmt = 1;.  }.  
13bd0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13be0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13bf0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
13c00 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74  mit the statment
13c10 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
13c20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
13c30 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a  gress.  If no.**
13c40 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
13c50 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20  is active, this 
13c60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
13c70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
13c80 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20  ommitStmt(Btree 
13c90 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
13ca0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13cb0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
13cc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13cd0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13ce0 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
13cf0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
13d00 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
13d10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13d20 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  StmtCommit(pBt->
13d30 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
13d40 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13d50 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
13d60 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73  >inStmt = 0;.  s
13d70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13d80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
13da0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73  ack the active s
13db0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
13dc0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20  saction.  If no 
13dd0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  subtransaction.*
13de0 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73  * is active this
13df0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13e00 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  -op..**.** All c
13e10 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
13e20 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
13e30 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
13e40 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  ny attempt.** to
13e50 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68   use a cursor th
13e60 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
13e70 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
13e80 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  this operation.*
13e90 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  * will result in
13ea0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
13eb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
13ec0 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65  llbackStmt(Btree
13ed0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
13ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
13ef0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13f00 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
13f10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13f20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13f30 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
13f40 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
13f50 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
13f60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13f70 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  tRollback(pBt->p
13f80 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
13f90 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
13fa0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
13fb0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
13fc0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
13fd0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13fe0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13ff0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
14000 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
14010 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
14020 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
14030 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20  age.** iTable.  
14040 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69  The act of acqui
14050 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65  ring a cursor ge
14060 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ts a read lock o
14070 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
14080 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
14090 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
140a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
140b0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
140c0 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
140d0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
140e0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
140f0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
14100 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
14110 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
14120 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
14130 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
14140 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
14150 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
14160 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
14170 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
14180 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
14190 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
141a0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
141b0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
141c0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
141d0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
141e0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
141f0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
14200 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
14210 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
14220 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
14230 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
14240 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
14250 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
14260 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
14270 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
14280 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
14290 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
142a0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
142b0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
142c0 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
142d0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
142e0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
142f0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
14300 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
14310 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
14320 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
14330 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
14340 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
14350 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
14360 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
14370 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
14380 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
14390 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
143a0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
143b0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
143c0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
143d0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
143e0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
143f0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
14400 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
14410 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
14420 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
14430 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
14440 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
14450 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
14480 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
144b0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
144c0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
144d0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
14500 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
14510 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
14520 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
14530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
14540 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
14550 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
14560 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14570 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
14580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
14590 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
145a0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
145b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
145c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
145d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
145e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
145f0 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   );.  if( wrFlag
14600 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
14610 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14630 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
14640 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
14650 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
14660 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
14670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
14680 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KED;.    }.  }..
14690 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
146a0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
146b0 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
146c0 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
146d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
146e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
146f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14700 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
14710 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrFlag ){.     
14720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
14730 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
14740 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52   }.  pCur->pgnoR
14750 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
14760 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  le;.  if( iTable
14770 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50 61  ==1 && sqlite3Pa
14780 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
14790 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
147a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
147b0 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
147c0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
147d0 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
147e0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
147f0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
14800 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
14810 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
14820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14830 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
14840 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
14850 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
14860 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
14870 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
14880 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
14890 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
148a0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
148b0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
148c0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
148d0 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
148e0 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
148f0 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
14900 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
14910 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
14920 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
14930 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
14940 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
14950 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
14960 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
14970 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
14980 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
14990 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
149a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
149b0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
149c0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
149d0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
149e0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
149f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
14a00 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D;..  return SQL
14a10 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f  ITE_OK;..create_
14a20 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
14a30 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
14a40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14a50 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
14a60 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  }.  unlockBtreeI
14a70 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
14a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
14a90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14aa0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
14ae0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
14b20 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
14b30 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
14b70 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
14b80 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
14b90 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14bb0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
14bc0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
14bd0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
14c00 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
14c10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
14c20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14c30 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
14c40 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
14c50 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
14c60 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
14c70 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
14c80 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Cur);.  sqlite3B
14c90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14ca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
14cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14cc0 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20 72 65 74  sorSize(){.  ret
14cd0 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72  urn sizeof(BtCur
14ce0 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  sor);.}..../*.**
14cf0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
14d00 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
14d10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14d20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
14d30 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
14d40 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
14d50 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14d60 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
14d70 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
14d80 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
14d90 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
14da0 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
14db0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
14dc0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
14dd0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
14de0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
14df0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
14e00 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
14e10 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
14e20 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
14e30 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
14e40 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
14e50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
14e60 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
14e70 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
14e80 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
14e90 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
14ea0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
14eb0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
14ec0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14ed0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
14ee0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
14ef0 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
14f00 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
14f10 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
14f20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
14f30 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
14f40 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
14f50 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
14f60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
14f70 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
14f80 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14f90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
14fa0 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
14fb0 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
14fc0 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
14fd0 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
14fe0 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
14ff0 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
15000 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
15010 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
15020 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
15030 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
15040 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
15050 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
15060 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
15070 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
15080 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70  pCur) );.  memcp
15090 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
150a0 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
150b0 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
150c0 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
150d0 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
150e0 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
150f0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
15100 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
15110 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44  mpCur->pPage->pD
15120 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
15130 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
15140 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
15150 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
15160 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
15170 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
15180 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
15190 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
151a0 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
151b0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
151c0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
151d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
151e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
151f0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
15200 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
15210 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
15220 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
15230 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
15240 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
15250 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
15260 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
15270 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
15280 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
15290 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
152a0 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
152b0 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  all.** sqlite3Bt
152c0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
152d0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
152e0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
152f0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
15300 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
15310 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
15320 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
15330 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
15340 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
15350 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
15360 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
15370 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
15380 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
15390 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
153a0 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
153b0 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
153c0 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
153d0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
153e0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
153f0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
15400 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
15410 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
15420 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
15430 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
15440 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
15450 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
15460 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
15470 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
15480 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
15490 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
154a0 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
154b0 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
154c0 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
154d0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
154e0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
154f0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
15500 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
15510 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
15520 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
15530 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15540 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15550 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
15560 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
15570 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
15580 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
15590 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
155a0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
155b0 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29  Cur->idx, &info)
155c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
155d0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
155e0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
155f0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
15600 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
15610 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15620 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
15630 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
15640 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
15650 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
15660 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
15670 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
15680 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
15690 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
156a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
156b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
156c0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
156d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
156e0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
156f0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
15700 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
15710 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
15720 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dNKey = 1;.    }
15730 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
15740 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
15750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
15760 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
15770 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
15780 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
15790 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
157a0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
157b0 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
157c0 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
157d0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15800 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
15810 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
15820 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
15830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
15860 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15870 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
15880 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e  ur->idx, &pCur->
15890 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 20 5c  info);         \
158a0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
158b0 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
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 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
158f0 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
15940 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15980 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
15990 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  C_VER */../*.** 
159a0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
159b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
159c0 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
159d0 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
159e0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
159f0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
15a00 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
15a10 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
15a20 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
15a30 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
15a40 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
15a50 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
15a60 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
15a70 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
15a80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
15a90 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
15aa0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
15ab0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
15ac0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
15ad0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
15ae0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
15af0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
15b00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15b10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15b20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15b30 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15b40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15b50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15b70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
15b80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15b90 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
15ba0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
15bb0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15bc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15bd0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15be0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
15bf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15c00 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
15c10 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
15c20 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
15c30 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
15c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15c50 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
15c60 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
15c70 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
15c80 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
15c90 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
15ca0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
15cb0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
15cc0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
15cd0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
15ce0 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
15cf0 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
15d00 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
15d10 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
15d20 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
15d30 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
15d40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15d50 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
15d60 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
15d70 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
15d80 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
15d90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
15da0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
15db0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15dc0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15dd0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15de0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15df0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15e00 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
15e30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15e40 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
15e50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
15e60 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15e70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15e80 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15e90 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
15ea0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
15eb0 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
15ec0 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
15ed0 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
15ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
15ef0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
15f00 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
15f10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
15f20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
15f30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15f40 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
15f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
15f60 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
15f70 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
15f80 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
15f90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
15fa0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
15fb0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
15fc0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
15fd0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
15fe0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
15ff0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
16000 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
16010 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
16020 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
16030 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
16040 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
16050 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
16060 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16070 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
16080 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
16090 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
160a0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rwise:.**.** Unl
160b0 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73  ess pPgnoNext is
160c0 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20   NULL, the page 
160d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
160e0 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  xt overflow .** 
160f0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
16100 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74  ed list is writt
16110 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
16120 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a  . If page ovfl.*
16130 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  * is the last pa
16140 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
16150 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
16160 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
16170 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
16180 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
16190 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
161a0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68  o the MemPage* h
161b0 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67  andle.** for pag
161c0 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65  e ovfl. The unde
161d0 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61 67  rlying pager pag
161e0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
161f0 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74  requested.** wit
16200 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  h the noContent 
16210 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65  flag set, so the
16220 20 70 61 67 65 20 64 61 74 61 20 61 63 63 65 73   page data acces
16230 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69  sable via.** thi
16240 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74  s handle may not
16250 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a   be trusted..*/.
16260 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
16270 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
16280 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
16290 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162b0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
162c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
162d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
162e0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
162f0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
16300 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
16310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16320 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
16330 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
16340 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
16350 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
16360 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16370 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
16380 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e  utex) );.  /* On
16390 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20  e of these must 
163a0 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68  not be NULL. Oth
163b0 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c  erwise, why call
163c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20   this function? 
163d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61  */.  assert(ppPa
163e0 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29  ge || pPgnoNext)
163f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f  ;..  /* If pPgno
16400 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
16410 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
16420 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
16430 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20   to obtain.  ** 
16440 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72  a MemPage* refer
16450 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61  ence only. No pa
16460 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69  ge-data is requi
16470 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  red in this case
16480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
16490 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72  gnoNext ){.    r
164a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
164b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
164c0 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  vfl, ppPage, 1);
164d0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
164e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
164f0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
16500 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
16510 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
16520 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
16530 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
16540 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
16550 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
16560 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16570 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
16580 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
16590 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
165a0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
165b0 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
165c0 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
165d0 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
165e0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
165f0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
16600 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
16610 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
16620 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
16630 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
16640 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
16650 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
16660 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
16670 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
16680 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
16690 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
166a0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
166b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
166c0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
166d0 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
166e0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
166f0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
16700 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
16710 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
16720 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
16730 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
16740 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
16750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16760 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16770 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
16780 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
16790 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
167a0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
167b0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
167c0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 7d   iGuess;.      }
167d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
167e0 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  f..  if( next==0
167f0 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20 20   || ppPage ){.  
16800 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
16810 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20   = 0;..    rc = 
16820 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16830 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
16840 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b  pPage, next!=0);
16850 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d  .    assert(rc==
16860 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
16870 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20  ge==0);.    if( 
16880 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53  next==0 && rc==S
16890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
168a0 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
168b0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
168c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
168d0 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  ppPage ){.      
168e0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
168f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16900 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16910 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
16920 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
16930 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  ext;..  return r
16940 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  c;.}../*.** Copy
16950 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
16960 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
16970 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
16980 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
16990 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
169a0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
169b0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
169c0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
169d0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
169e0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
169f0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
16a00 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
16a10 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
16a20 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
16a30 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
16a40 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
16a50 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
16a60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
16a70 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
16a80 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
16a90 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
16aa0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
16ab0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
16ac0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
16ad0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
16ae0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
16af0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
16b00 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
16b10 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
16b20 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
16b30 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
16b40 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16b50 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
16b60 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
16b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16b80 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
16b90 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
16bc0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
16bd0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
16be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
16bf0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
16c00 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
16c10 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
16c20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
16c30 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
16c40 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
16c50 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
16c60 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
16c70 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
16c80 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
16c90 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
16ca0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
16cb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
16cc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
16cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16cf0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
16d00 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
16d10 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
16d20 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
16d30 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
16d40 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
16d50 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
16d60 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
16d70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
16d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16db0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
16dc0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
16dd0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
16de0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
16df0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
16e00 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
16e10 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
16e20 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
16e30 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
16e40 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
16e50 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
16e60 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
16e70 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
16e80 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
16e90 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
16ea0 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
16eb0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
16ec0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
16ed0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
16ee0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
16ef0 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
16f00 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
16f10 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
16f20 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f..**.** This ro
16f30 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d  utine does not m
16f40 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f  ake a distinctio
16f50 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e  n between key an
16f60 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75  d data..** It ju
16f70 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69 74  st reads or writ
16f80 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68  es bytes from th
16f90 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20  e payload area. 
16fa0 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20   Data might .** 
16fb0 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
16fc0 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63  in page or be sc
16fd0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
16fe0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
16ff0 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a   .** pages..**.*
17000 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
17010 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
17020 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
17030 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
17040 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
17050 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
17060 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
17070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
17080 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
17090 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
170a0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
170b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
170c0 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
170d0 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
170e0 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
170f0 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
17100 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
17110 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
17120 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
17130 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
17140 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
17150 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
17160 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
17170 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
17180 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
17190 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
171a0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
171b0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
171c0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
171d0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
171e0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
171f0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
17200 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
17210 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
17220 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
17230 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
17240 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
17250 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
17260 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
17270 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
17280 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
17290 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
172a0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
172b0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
172c0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
172d0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
172e0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
172f0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
17300 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
17310 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
17320 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
17330 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
17340 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f   from */.  int o
17350 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
17360 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
17370 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
17380 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20  ayload */.  int 
17390 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
173a0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
173b0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
173c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
173d0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
173e0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
173f0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
17400 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20 20   skipKey,       
17410 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69    /* offset begi
17420 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ns at data if th
17430 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  is is true */.  
17440 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
17450 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
17460 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
17470 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
17480 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17490 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
174a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
174b0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
174c0 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
174d0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
174e0 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20  Cur->pPage;     
174f0 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
17500 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
17510 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
17520 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
17530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
17540 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
17550 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
17560 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
17570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
17580 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
17590 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
175a0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
175b0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
175c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
175d0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
175e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
175f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
17600 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
17610 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
17620 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
17630 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
17640 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
17650 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
17660 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
17670 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  : pCur->info.nKe
17680 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b  y);..  if( skipK
17690 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
176a0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
176b0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
176c0 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
176d0 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a  .nData ){.    /*
176e0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
176f0 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
17700 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
17710 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
17720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17730 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
17740 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
17750 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
17760 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
17770 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
17780 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
17790 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
177a0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
177b0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
177c0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
177d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
177e0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
177f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
17800 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
17810 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
17820 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
17830 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
17840 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
17850 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
17860 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
17870 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
17880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
17890 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
178a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
178b0 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  .  pBt = pCur->p
178c0 42 74 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  Bt;.  if( rc==SQ
178d0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
178e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
178f0 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  t ovflSize = pBt
17900 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
17910 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
17920 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
17930 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
17940 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
17950 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
17960 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
17970 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
17980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17990 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
179a0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
179b0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
179c0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
179d0 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
179e0 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
179f0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
17a00 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
17a10 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
17a20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
17a30 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
17a40 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
17a50 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
17a60 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
17a70 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
17a80 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
17a90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
17aa0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
17ab0 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
17ac0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
17ad0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
17ae0 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
17af0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
17b00 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
17b10 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
17b20 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
17b30 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
17b40 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
17b50 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
17b60 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
17b70 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
17b80 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
17b90 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
17ba0 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
17bb0 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
17bc0 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
17bd0 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
17be0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
17bf0 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
17c00 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70   if( nOvfl && !p
17c10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
17c20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
17c30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
17c40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
17c50 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
17c60 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
17c70 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
17c80 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
17c90 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
17ca0 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
17cb0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
17cc0 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
17cd0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
17ce0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
17cf0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
17d00 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
17d10 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
17d20 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
17d30 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
17d40 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
17d50 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
17d60 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
17d70 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
17d80 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
17d90 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ize);.    }.#end
17da0 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72  if..    for( ; r
17db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17dc0 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
17dd0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66  e; iIdx++){..#if
17de0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17df0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
17e00 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
17e10 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
17e20 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
17e30 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
17e40 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
17e50 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  low ){.        a
17e60 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
17e70 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
17e80 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
17e90 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
17ea0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
17eb0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
17ec0 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
17ed0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
17ee0 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
17ef0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
17f00 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
17f10 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
17f20 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
17f30 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
17f40 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
17f50 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
17f60 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
17f70 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
17f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
17f90 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
17fa0 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
17fb0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
17fc0 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
17fd0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17fe0 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
17ff0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
18000 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
18010 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
18020 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
18030 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18040 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
18050 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
18060 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
18070 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18080 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
18090 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
180a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
180b0 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
180c0 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20   else .#endif.  
180d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
180e0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
180f0 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
18100 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
18110 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
18120 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
18130 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
18140 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
18150 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
18160 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
18170 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
18180 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
18190 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
181a0 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
181b0 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
181c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
181d0 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
181e0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
181f0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
18200 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18210 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
18220 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
18230 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18260 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
18270 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
18280 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18290 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
182a0 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
182b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
182c0 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
182d0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
182e0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
182f0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
18300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18310 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
18320 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
18330 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
18340 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
18350 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18360 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
18370 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
18380 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
18390 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
183a0 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20  .          pBuf 
183b0 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += a;.        }.
183c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
183d0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
183e0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
183f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18400 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18410 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
18420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
18430 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
18440 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
18450 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
18460 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
18470 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
18480 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
18490 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
184a0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
184b0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
184c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
184d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
184e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
184f0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
18500 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
18510 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
18520 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
18530 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
18540 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
18550 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
18560 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
18570 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18580 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
18590 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
185a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
185b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
185c0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
185d0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
185e0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
185f0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
18600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18610 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18620 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18630 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
18640 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18650 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
18660 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
18670 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
18680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18690 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
186a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
186b0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
186c0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
186d0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
186e0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
186f0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
18700 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
18710 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
18720 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
18730 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
18740 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 0, 0);.  }. 
18750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18760 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
18770 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
18780 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
18790 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
187a0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
187b0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
187c0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
187d0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
187e0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
187f0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
18800 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18810 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
18820 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
18830 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18840 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
18850 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
18860 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
18870 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
18880 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
18890 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
188a0 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
188b0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
188c0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
188d0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
188e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
188f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
18900 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
18910 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18920 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18930 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18950 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18960 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18970 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18980 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18990 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
189a0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
189b0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
189c0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
189d0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
189e0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
189f0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
18a00 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
18a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18a20 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
18a30 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
18a40 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
18a50 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
18a60 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
18a70 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
18a80 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
18a90 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
18aa0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
18ab0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
18ac0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
18ad0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18ae0 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
18af0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
18b00 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18b10 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
18b20 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
18b30 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
18b40 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
18b50 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
18b60 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
18b70 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
18b80 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
18b90 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
18ba0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
18bb0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
18bc0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
18bd0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
18be0 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
18bf0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
18c00 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
18c10 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
18c20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
18c30 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
18c40 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
18c50 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
18c60 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
18c70 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
18c80 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
18c90 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
18ca0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
18cb0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
18cc0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
18cd0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79  ed to reassembly
18ce0 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
18cf0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
18d00 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
18d10 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
18d20 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
18d30 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
18d40 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
18d50 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
18d60 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
18d70 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
18d80 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
18d90 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
18da0 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
18db0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
18dc0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
18dd0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
18de0 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
18df0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
18e00 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
18e10 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
18e20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
18e30 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
18e40 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
18e50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
18e60 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
18e70 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
18e80 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
18e90 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
18ea0 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
18eb0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
18ec0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
18ed0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
18ee0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
18ef0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
18f00 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   int nLocal;..  
18f10 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
18f20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  && pCur->pPage!=
18f30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18f40 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18f50 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
18f60 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18f70 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18f80 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
18f90 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
18fa0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
18fb0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
18fc0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
18fd0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
18fe0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
18ff0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
19000 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
19010 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
19020 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
19030 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
19040 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
19050 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d      nKey = pCur-
19060 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
19070 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
19080 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
19090 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
190a0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
190b0 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
190c0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
190d0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
190e0 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e  Local;.    if( n
190f0 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20  Local>nKey ){.  
19100 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65      nLocal = nKe
19110 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  y;.    }.  }.  *
19120 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
19130 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
19140 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
19150 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
19160 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
19170 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
19180 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
19190 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
191a0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
191b0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
191c0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
191d0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
191e0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
191f0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
19200 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
19210 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
19220 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
19230 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
19240 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
19250 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
19260 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
19270 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
19280 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
19290 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
192a0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
192b0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
192c0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
192d0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
192e0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
192f0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
19300 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
19310 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
19320 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
19330 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
19340 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
19350 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
19360 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
19370 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
19380 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
19390 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
193a0 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
193b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
193c0 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
193d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
193e0 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
193f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19400 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
19410 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
19420 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
19430 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
19440 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19450 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  0;.}.const void 
19460 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
19470 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
19480 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
19490 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
194a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
194b0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
194c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
194d0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
194e0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
194f0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
19500 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
19510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19520 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
19530 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
19540 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
19550 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
19560 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
19570 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
19580 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
19590 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
195a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
195b0 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
195c0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
195d0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
195e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
195f0 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
19600 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68  pOldPage;.  BtSh
19610 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
19620 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
19630 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19640 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
19650 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19660 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19670 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
19680 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
19690 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
196a0 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
196b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
196c0 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67  rn rc;.  pNewPag
196d0 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70  e->idxParent = p
196e0 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64  Cur->idx;.  pOld
196f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
19700 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e  ge;.  pOldPage->
19710 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
19720 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64  releasePage(pOld
19730 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
19740 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b  Page = pNewPage;
19750 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
19760 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
19770 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
19780 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
19790 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
197a0 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20  >nCell<1 ){.    
197b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
197c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
197d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
197e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
197f0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
19800 70 61 67 65 20 69 73 20 74 68 65 20 76 69 72 74  page is the virt
19810 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20  ual root of its 
19820 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
19830 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19840 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
19850 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62  age for most tab
19860 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72  les.  But.** for
19870 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
19880 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d  d on page 1, som
19890 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72  etime the real r
198a0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65  oot page.** is e
198b0 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 20  mpty except for 
198c0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
198d0 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65  r.  In such case
198e0 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  s the.** virtual
198f0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
19900 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
19910 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
19920 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f   page.** 1 is po
19930 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
19940 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
19950 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65  RootPage(MemPage
19960 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
19970 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20  age *pParent;.. 
19980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19990 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
199a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
199b0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
199c0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
199d0 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
199e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
199f0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31   pParent->pgno>1
19a00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19a10 66 28 20 67 65 74 32 62 79 74 65 28 26 70 50 61  f( get2byte(&pPa
19a20 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
19a30 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  ent->hdrOffset+3
19a40 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
19a50 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
19a60 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19a70 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
19a80 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
19a90 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
19aa0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
19ab0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
19ac0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
19ad0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
19ae0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
19af0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
19b00 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
19b10 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
19b20 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
19b30 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
19b40 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
19b50 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
19b60 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
19b70 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
19b80 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
19b90 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19ba0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
19bb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19bc0 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e  ;.  int idxParen
19bd0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
19be0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19bf0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
19c00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19c10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19c20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
19c30 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
19c40 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
19c50 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 42  ssert( !sqlite3B
19c60 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
19c70 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65  Page) );.  pPare
19c80 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
19c90 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
19ca0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
19cb0 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  dxParent = pPage
19cc0 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73  ->idxParent;.  s
19cd0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
19ce0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
19cf0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19d00 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
19d10 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
19d20 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19d30 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
19d40 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
19d50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
19d60 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29  t->idxShift==0 )
19d70 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  ;.  pCur->idx = 
19d80 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a  idxParent;.}../*
19d90 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19da0 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  sor to the root 
19db0 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  page.*/.static i
19dc0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
19dd0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
19de0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
19df0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19e00 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
19e10 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
19e20 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
19e30 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
19e40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19e50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19e60 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
19e70 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
19e80 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
19e90 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
19ea0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
19eb0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
19ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
19ed0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
19ee0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
19ef0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
19f00 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
19f10 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
19f20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19f30 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
19f40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19f50 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20   pCur->skip;.   
19f60 20 7d 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73   }.    clearCurs
19f70 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
19f80 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
19f90 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
19fa0 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f  f( pRoot && pRoo
19fb0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
19fc0 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61  gnoRoot ){.    a
19fd0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
19fe0 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  Init );.  }else{
19ff0 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20  .    if( .      
1a000 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
1a010 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
1a020 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
1a030 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29  oot, &pRoot, 0))
1a040 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
1a050 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1a060 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1a070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a080 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
1a090 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
1a0a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
1a0b0 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20  e = pRoot;.  }. 
1a0c0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
1a0d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1a0e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1a0f0 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
1a100 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1a110 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  0;.  if( pRoot->
1a120 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
1a130 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
1a140 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
1a150 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1a160 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20  >pgno==1 );.    
1a170 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
1a180 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
1a190 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
1a1a0 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
1a1b0 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a  t( subpage>0 );.
1a1c0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1a1d0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
1a1e0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1a1f0 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
1a200 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  age);.  }.  pCur
1a210 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43 75  ->eState = ((pCu
1a220 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  r->pPage->nCell>
1a230 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
1a240 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
1a250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a260 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a270 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1a280 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1a290 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1a2a0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
1a2b0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1a2c0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
1a2d0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
1a2e0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
1a2f0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
1a300 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
1a310 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
1a320 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1a330 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a340 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
1a350 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1a360 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1a370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a380 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1a390 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a3a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a3b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a3c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a3d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1a3e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1a3f0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1a400 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
1a410 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
1a420 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1a430 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
1a440 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1a450 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1a460 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1a470 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20   pCur->idx));.  
1a480 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a490 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a4a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a4b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1a4c0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1a4d0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1a4e0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1a4f0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
1a500 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1a510 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1a520 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
1a530 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
1a540 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
1a550 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
1a560 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
1a570 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
1a580 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
1a590 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1a5a0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
1a5b0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
1a5c0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
1a5d0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
1a5e0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1a5f0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
1a600 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1a610 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
1a620 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1a630 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
1a640 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
1a650 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1a660 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a670 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
1a680 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1a690 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1a6a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a6b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1a6c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1a6d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1a6e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1a6f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a700 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a710 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1a720 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1a730 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
1a740 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
1a750 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1a760 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1a770 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1a780 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1a790 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
1a7a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a7b0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a7c0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1a7d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1a7e0 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65  Cur->idx = pPage
1a7f0 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20  ->nCell - 1;.   
1a800 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1a810 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1a820 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1a830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1a840 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
1a850 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1a860 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1a870 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1a880 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1a890 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1a8a0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1a8b0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1a8c0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1a8d0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1a8e0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1a8f0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1a900 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1a910 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
1a920 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a930 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1a940 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1a950 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1a960 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1a970 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a980 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1a990 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1a9a0 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
1a9b0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1a9c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a9d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
1a9e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a9f0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1aa00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1aa10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1aa20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1aa30 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   1;.      rc = S
1aa40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1aa50 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1aa60 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1aa70 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
1aa80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1aa90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1aaa0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1aab0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1aac0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1aad0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1aae0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1aaf0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1ab00 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1ab10 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1ab20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1ab30 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1ab40 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1ab50 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1ab60 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1ab70 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1ab80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ab90 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
1aba0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1abb0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1abc0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
1abd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1abe0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1abf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1ac00 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1ac10 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1ac20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1ac30 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1ac40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ac50 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
1ac60 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1ac70 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
1ac80 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1ac90 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1aca0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1acb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1acc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1acd0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1ace0 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
1acf0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
1ad00 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1ad10 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67  t(pCur);.      g
1ad20 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1ad30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
1ad40 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
1ad50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1ad60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ad70 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1ad80 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
1ad90 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
1ada0 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
1adb0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
1adc0 4b 65 79 2f 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e  Key/nKey/pUnKey.
1add0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1ade0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1adf0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1ae00 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70   only the nKey p
1ae10 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
1ae20 2e 20 20 70 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  .  pKey .** and 
1ae30 70 55 6e 4b 65 79 20 6d 75 73 74 20 62 65 20 4e  pUnKey must be N
1ae40 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
1ae50 74 61 62 6c 65 73 2c 20 65 69 74 68 65 72 20 70  tables, either p
1ae60 55 6e 4b 65 79 0a 2a 2a 20 6d 75 73 74 20 70 6f  UnKey.** must po
1ae70 69 6e 74 20 74 6f 20 61 20 6b 65 79 20 74 68 61  int to a key tha
1ae80 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1ae90 65 6e 20 75 6e 70 61 63 6b 65 64 2c 20 6f 72 20  en unpacked, or 
1aea0 65 6c 73 65 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65  else.** pKey/nKe
1aeb0 79 20 64 65 73 63 72 69 62 65 73 20 61 20 62 6c  y describes a bl
1aec0 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ob containing th
1aed0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e key..**.** If 
1aee0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1aef0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1af00 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1af10 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1af20 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1af30 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1af40 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1af50 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1af60 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1af70 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1af80 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1af90 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1afa0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1afb0 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ey..**.** The re
1afc0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
1afd0 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
1afe0 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
1aff0 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  h the.** cursor 
1b000 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
1b010 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c  Res if pRes!=NUL
1b020 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  L.  The meaning 
1b030 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65  of.** this value
1b040 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1b050 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
1b060 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1b070 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1b080 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1b090 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1b0a0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
1b0b0 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20  er than pKey or 
1b0c0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1b0d0 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1b0e0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1b0f0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1b100 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1b110 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1b120 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1b130 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1b140 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1b150 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1b160 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b170 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1b180 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a  ches pKey..**.**
1b190 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1b1a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b1b0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b1c0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b1d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b1e0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1b1f0 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  n pKey..**.*/.in
1b200 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1b210 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
1b220 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f   *pCur,        /
1b230 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1b240 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f  be moved */.  co
1b250 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1b260 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
1b270 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69  content for indi
1b280 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62  ces.  Not used b
1b290 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 55 6e  y tables */.  Un
1b2a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
1b2b0 6e 4b 65 79 2c 2f 2a 20 55 6e 70 61 63 6b 65 64  nKey,/* Unpacked
1b2c0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79   version of pKey
1b2d0 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b2f0 53 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f  Size of pKey.  O
1b300 72 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61  r the key for ta
1b310 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  bles */.  int bi
1b320 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
1b330 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
1b340 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
1b350 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
1b360 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
1b370 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
1b380 63 68 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a  ch result flag *
1b390 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1b3a0 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30   char aSpace[200
1b3b0 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  ];..  assert( cu
1b3c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b3d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1b3e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b3f0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1b400 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1b410 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1b420 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
1b430 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
1b440 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
1b450 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
1b460 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
1b470 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1b480 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
1b490 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
1b4a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b4b0 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69  ID && pCur->vali
1b4c0 64 4e 4b 65 79 20 26 26 20 70 43 75 72 2d 3e 70  dNKey && pCur->p
1b4d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1b4e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1b4f0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b  fo.nKey==nKey ){
1b500 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1b510 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b530 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
1b540 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
1b550 66 6f 2e 6e 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a  fo.nKey<nKey ){.
1b560 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
1b570 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b590 20 20 7d 0a 0a 0a 20 20 72 63 20 3d 20 6d 6f 76    }...  rc = mov
1b5a0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1b5b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1b5c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1b5d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b5e0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1b5f0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73   pCur->pPage->is
1b600 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43  Init );.  if( pC
1b610 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b620 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1b630 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
1b640 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b650 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1b660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1b680 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
1b690 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
1b6a0 20 57 65 20 61 72 65 20 67 69 76 65 6e 20 61 6e   We are given an
1b6b0 20 53 51 4c 20 74 61 62 6c 65 20 74 6f 20 73 65   SQL table to se
1b6c0 61 72 63 68 2e 20 20 54 68 65 20 6b 65 79 20 69  arch.  The key i
1b6d0 73 20 74 68 65 20 69 6e 74 65 67 65 72 0a 20 20  s the integer.  
1b6e0 20 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6e 74 61    ** rowid conta
1b6f0 69 6e 65 64 20 69 6e 20 6e 4b 65 79 2e 20 20 70  ined in nKey.  p
1b700 4b 65 79 20 61 6e 64 20 70 55 6e 4b 65 79 20 73  Key and pUnKey s
1b710 68 6f 75 6c 64 20 62 6f 74 68 20 62 65 20 4e 55  hould both be NU
1b720 4c 4c 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  LL */.    assert
1b730 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20  ( pUnKey==0 );. 
1b740 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d     assert( pKey=
1b750 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  =0 );.  }else if
1b760 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20  ( pUnKey==0 ){. 
1b770 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20     /* We are to 
1b780 73 65 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e  search an SQL in
1b790 64 65 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20  dex using a key 
1b7a0 65 6e 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f  encoded as a blo
1b7b0 62 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 6c  b..    ** The bl
1b7c0 6f 62 20 69 73 20 66 6f 75 6e 64 20 61 74 20 70  ob is found at p
1b7d0 4b 65 79 20 61 6e 64 20 69 73 20 6e 4b 65 79 20  Key and is nKey 
1b7e0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
1b7f0 20 20 55 6e 70 61 63 6b 0a 20 20 20 20 2a 2a 20    Unpack.    ** 
1b800 74 68 69 73 20 6b 65 79 20 73 6f 20 74 68 61 74  this key so that
1b810 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 20   we can use it. 
1b820 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1b830 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 70 55  Key!=0 );.    pU
1b840 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  nKey = sqlite3Vd
1b850 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
1b860 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e  Cur->pKeyInfo, n
1b870 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
1b8a0 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
1b8b0 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
1b8c0 55 6e 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  UnKey==0 ) retur
1b8d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1b8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b8f0 57 65 20 61 72 65 20 74 6f 20 73 65 61 72 63 68  We are to search
1b900 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 75 73   an SQL index us
1b910 69 6e 67 20 61 20 6b 65 79 20 74 68 61 74 20 69  ing a key that i
1b920 73 20 61 6c 72 65 61 64 79 20 75 6e 70 61 63 6b  s already unpack
1b930 65 64 0a 20 20 20 20 2a 2a 20 61 6e 64 20 68 61  ed.    ** and ha
1b940 6e 64 65 64 20 74 6f 20 75 73 20 69 6e 20 70 55  nded to us in pU
1b950 6e 4b 65 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  nKey. */.    ass
1b960 65 72 74 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a  ert( pKey==0 );.
1b970 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20    }.  for(;;){. 
1b980 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1b990 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1b9a0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1b9b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1b9c0 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1b9d0 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1b9e0 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1b9f0 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1ba00 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1ba10 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1ba20 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1ba30 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1ba40 79 20 26 26 20 70 55 6e 4b 65 79 3d 3d 30 20 29  y && pUnKey==0 )
1ba50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ba60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ba70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
1ba80 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1ba90 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69  }.    if( biasRi
1baa0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ght ){.      pCu
1bab0 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20  r->idx = upr;.  
1bac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1bad0 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b  Cur->idx = (upr+
1bae0 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20  lwr)/2;.    }.  
1baf0 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29    if( lwr<=upr )
1bb00 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
1bb10 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
1bb20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
1bb30 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ey;.      pCur->
1bb40 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1bb50 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
1bb60 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
1bb70 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1bb80 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ey ){.        u8
1bb90 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20   *pCell;.       
1bba0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
1bbb0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1bbc0 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
1bbd0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
1bbe0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
1bbf0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
1bc00 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1bc10 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
1bc20 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
1bc30 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
1bc40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
1bc50 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
1bc60 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
1bc70 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
1bc80 6c 6c 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20  llKey==nKey ){. 
1bc90 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
1bca0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1bcb0 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20  ( nCellKey<nKey 
1bcc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1bcd0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1bce0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1bcf0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e  sert( nCellKey>n
1bd00 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1bd10 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
1bd20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1bd30 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69          int avai
1bd40 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70  lable;.        p
1bd50 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20  CellKey = (void 
1bd60 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1bd70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c  Cur, &available,
1bd80 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65   0);.        nCe
1bd90 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e  llKey = pCur->in
1bda0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
1bdb0 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d   if( available>=
1bdc0 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20  nCellKey ){.    
1bdd0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
1bde0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1bdf0 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65  re(nCellKey, pCe
1be00 6c 6c 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a  llKey, pUnKey);.
1be10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1be20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
1be30 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  y = sqlite3_mall
1be40 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  oc( nCellKey );.
1be50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1be60 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
1be70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1be80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1be90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
1bea0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1beb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1bed0 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1bee0 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20  nCellKey, (void 
1bef0 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
1bf00 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1bf10 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1bf20 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  are(nCellKey, pC
1bf30 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b  ellKey, pUnKey);
1bf40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1bf50 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
1bf60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1bf70 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
1bf80 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
1bf90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bfa0 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
1bfb0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1bfc0 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
1bfd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1bfe0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
1bff0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1c000 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
1c010 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20   pCur->idx;.    
1c020 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20        upr = lwr 
1c030 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  - 1;.          b
1c040 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1c050 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1c060 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20  f( pRes ) *pRes 
1c070 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
1c080 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c090 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1c0a0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c0c0 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
1c0d0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43          lwr = pC
1c0e0 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20  ur->idx+1;.     
1c0f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c100 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d  upr = pCur->idx-
1c110 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1c120 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
1c130 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1c140 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1c150 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ey;.        brea
1c160 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c170 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77   pCur->idx = (lw
1c180 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a  r+upr)/2;.    }.
1c190 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
1c1a0 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73  =upr+1 );.    as
1c1b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1c1c0 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
1c1d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c1e0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
1c1f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
1c200 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
1c210 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1c220 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1c230 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1c240 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1c250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c260 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
1c270 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1c280 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
1c290 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
1c2a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c2b0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
1c2c0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
1c2d0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
1c2e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ;.      if( pRes
1c2f0 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20   ) *pRes = c;.  
1c300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c310 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
1c320 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c330 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1c340 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75  x = lwr;.    pCu
1c350 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1c360 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
1c370 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
1c380 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1c390 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
1c3a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1c3b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1c3c0 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
1c3d0 73 68 3a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  sh:.  if( pKey )
1c3e0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63  {.    /* If we c
1c3f0 72 65 61 74 65 64 20 6f 75 72 20 6f 77 6e 20 75  reated our own u
1c400 6e 70 61 63 6b 65 64 20 6b 65 79 20 61 74 20 74  npacked key at t
1c410 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 0a 20  he top of this. 
1c420 20 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2c     ** procedure,
1c430 20 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74 68   then destroy th
1c440 61 74 20 6b 65 79 20 62 65 66 6f 72 65 20 72 65  at key before re
1c450 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  turning. */.    
1c460 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1c470 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
1c480 70 55 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72  pUnKey);.  }.  r
1c490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1c4a0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1c4b0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1c4c0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
1c4d0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1c4e0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
1c4f0 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
1c500 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
1c510 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
1c520 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
1c530 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
1c540 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1c550 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
1c560 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
1c570 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
1c580 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
1c590 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
1c5a0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1c5b0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1c5c0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
1c5d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
1c5e0 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
1c5f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
1c600 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1c610 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
1c620 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
1c630 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
1c640 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
1c650 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
1c660 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
1c670 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
1c680 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
1c690 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
1c6a0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
1c6b0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
1c6c0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
1c6d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1c6e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1c6f0 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ion handle for a
1c700 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69   cursor..*/.sqli
1c710 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72 65  te3 *sqlite3Btre
1c720 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74 20  eCursorDb(const 
1c730 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1c740 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c750 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1c760 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1c770 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
1c780 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  rn pCur->pBtree-
1c790 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  >db;.}../*.** Ad
1c7a0 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
1c7b0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
1c7c0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1c7d0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1c7e0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1c7f0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1c800 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1c810 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1c820 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1c830 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c840 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1c850 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1c860 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1c870 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1c880 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
1c890 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1c8a0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1c8b0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
1c8c0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1c8d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c8e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1c8f0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
1c900 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1c910 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
1c920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c930 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1c940 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
1c950 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  0 );.  pPage = p
1c960 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66  Cur->pPage;.  if
1c970 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1c980 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1c990 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1c9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c9b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1c9c0 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b   pCur->skip>0 ){
1c9d0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1c9e0 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1c9f0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1ca00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1ca10 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1ca20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ca30 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
1ca40 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c  sert( pCur->idx<
1ca50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1ca60 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a  .  pCur->idx++;.
1ca70 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1ca80 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1ca90 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1caa0 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d   if( pCur->idx>=
1cab0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1cac0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1cad0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1cae0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1caf0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
1cb00 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1cb10 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1cb20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1cb30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1cb40 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
1cb50 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1cb60 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1cb70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cb80 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
1cb90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
1cba0 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
1cbb0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
1cbc0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1cbd0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1cbe0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1cbf0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
1cc00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1cc10 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1cc20 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1cc30 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1cc40 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1cc50 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
1cc60 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1cc70 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1cc80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1cc90 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1cca0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ata ){.      rc 
1ccb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
1ccc0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1ccd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ccf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1cd00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
1cd10 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1cd20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1cd30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cd40 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
1cd50 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1cd60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cd70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
1cd80 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1cd90 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
1cda0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
1cdb0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1cdc0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1cdd0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1cde0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1cdf0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1ce00 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
1ce10 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
1ce20 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1ce30 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1ce40 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
1ce50 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
1ce60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ce70 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
1ce80 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1ce90 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1cea0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  ;.  Pgno pgno;. 
1ceb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1cec0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1ced0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1cee0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1cef0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
1cf00 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1cf10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1cf20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1cf30 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
1cf40 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
1cf50 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1cf60 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1cf70 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1cf80 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1cf90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1cfa0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30  if( pCur->skip<0
1cfb0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1cfc0 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1cfd0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1cfe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1cff0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1d000 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
1d010 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
1d020 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1d030 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
1d040 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a  pCur->idx>=0 );.
1d050 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1d060 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1d070 20 67 65 74 34 62 79 74 65 28 20 66 69 6e 64 43   get4byte( findC
1d080 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
1d090 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20  >idx) );.    rc 
1d0a0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1d0b0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
1d0c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
1d0d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d0e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
1d0f0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1d100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
1d110 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30  le( pCur->idx==0
1d120 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
1d130 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
1d140 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20  Page(pPage) ){. 
1d150 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
1d160 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1d170 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
1d180 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1d190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d1a0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1d1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1d1c0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1d1d0 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
1d1e0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1d1f0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d  }.    pCur->idx-
1d200 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  -;.    pCur->inf
1d210 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1d220 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1d230 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1d240 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
1d250 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1d260 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1d270 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
1d280 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
1d290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d2a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d2b0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73     }.  }.  *pRes
1d2c0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1d2d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
1d2e0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
1d2f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d300 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
1d310 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
1d320 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
1d330 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
1d340 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d350 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
1d360 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
1d370 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
1d380 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
1d390 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
1d3a0 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
1d3b0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
1d3c0 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
1d3d0 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
1d3e0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
1d3f0 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
1d400 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
1d410 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
1d420 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1d430 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
1d440 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
1d450 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1d460 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
1d470 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e  ppPage and *pPgn
1d480 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  o are undefined 
1d490 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
1d4a0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20  an error..** Do 
1d4b0 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  not invoke sqlit
1d4c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
1d4d0 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20  n *ppPage if an 
1d4e0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d4f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1d500 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
1d510 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
1d520 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66  n a (feeble) eff
1d530 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
1d540 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
1d550 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
1d560 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
1d570 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
1d580 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
1d590 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
1d5a0 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
1d5b0 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
1d5c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1d5d0 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
1d5e0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
1d5f0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
1d600 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
1d610 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61  f the "exact" pa
1d620 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1d630 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e  , and the page-n
1d640 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69  umber nearby exi
1d650 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65  sts .** anywhere
1d660 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1d670 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
1d680 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72  arenteed to be r
1d690 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
1d6a0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
1d6b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1d6c0 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f  abases when allo
1d6d0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  cating a new tab
1d6e0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1d6f0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
1d700 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1d710 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65  *pBt, .  MemPage
1d720 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67   **ppPage, .  Pg
1d730 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67  no *pPgno, .  Pg
1d740 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20  no nearby,.  u8 
1d750 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  exact.){.  MemPa
1d760 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
1d770 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20  t rc;.  int n;  
1d780 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d790 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1d7a0 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b  elist */.  int k
1d7b0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1d7c0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
1d7d0 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
1d7e0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
1d7f0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
1d800 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
1d810 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61  vTrunk = 0;..  a
1d820 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d830 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d840 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
1d850 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1d860 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
1d870 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d880 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29  6]);.  if( n>0 )
1d890 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
1d8a0 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
1d8b0 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
1d8c0 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
1d8d0 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
1d8e0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
1d8f0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
1d900 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
1d910 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
1d920 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
1d930 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
1d940 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20   If the 'exact' 
1d950 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72  parameter was tr
1d960 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  ue and a query o
1d970 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
1d980 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
1d990 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
1d9a0 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
1d9b0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
1d9c0 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
1d9d0 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
1d9e0 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
1d9f0 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
1da00 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
1da10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1da20 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
1da30 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d  xact && nearby<=
1da40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1da50 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1da60 72 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  r) ){.      u8 e
1da70 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
1da80 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
1da90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1daa0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
1dab0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1dac0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
1dad0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
1dae0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1daf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
1db00 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1db10 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1db20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1db30 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1db40 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
1db50 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
1db60 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
1db70 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
1db80 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
1db90 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
1dba0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
1dbb0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
1dbc0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
1dbd0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
1dbe0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
1dbf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dc00 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1dc10 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1dc20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1dc30 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
1dc40 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1dc50 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
1dc60 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
1dc70 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
1dc80 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
1dc90 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
1dca0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
1dcb0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
1dcc0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
1dcd0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1dce0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
1dcf0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
1dd00 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
1dd10 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
1dd20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
1dd30 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
1dd40 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
1dd50 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
1dd60 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1dd70 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
1dd80 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1dd90 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
1dda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ddb0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1ddc0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1ddd0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
1dde0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
1ddf0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1de00 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
1de10 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
1de20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1de30 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1de40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1de50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1de60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
1de70 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1de80 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1de90 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
1dea0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
1deb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1dec0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
1ded0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
1dee0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
1def0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
1df00 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
1df10 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
1df20 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
1df30 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
1df40 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
1df50 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
1df60 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
1df70 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
1df80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1df90 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1dfa0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1dfb0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1dfc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1dfd0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1dfe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dff0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
1e000 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
1e010 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1e020 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1e030 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1e040 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1e050 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
1e060 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1e070 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1e080 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
1e090 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
1e0a0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
1e0b0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
1e0c0 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61  e if( k>pBt->usa
1e0d0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
1e0e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
1e0f0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
1e100 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
1e110 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
1e120 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e130 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e140 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1e150 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e160 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e170 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e180 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e190 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
1e1a0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
1e1b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1e1c0 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
1e1d0 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
1e1e0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
1e1f0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1e200 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
1e210 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1e220 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
1e230 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1e240 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
1e250 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
1e260 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1e270 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1e280 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1e290 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
1e2a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e2b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1e2c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1e2d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1e2e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1e2f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1e300 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
1e310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e320 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1e330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1e340 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1e350 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1e360 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1e370 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1e390 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
1e3a0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1e3b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1e3c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1e3d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e3e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1e3f0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
1e400 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
1e410 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
1e420 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
1e430 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
1e440 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
1e450 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
1e460 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
1e470 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
1e480 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1e490 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1e4a0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1e4b0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
1e4c0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
1e4d0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1e4e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
1e4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1e500 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1e510 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
1e520 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
1e530 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1e540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e560 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1e570 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1e580 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1e590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e5a0 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
1e5b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e5c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e5d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e5e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e5f0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1e600 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1e610 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1e620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e630 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1e640 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1e650 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1e660 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1e670 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e680 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1e690 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1e6a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1e6b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
1e6c0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1e6d0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
1e6e0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1e6f0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1e700 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1e710 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1e720 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1e730 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e740 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
1e750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1e760 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e770 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e780 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
1e790 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1e7a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1e7b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e7c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e7d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1e7e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e7f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
1e800 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1e810 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1e820 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
1e840 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1e850 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1e860 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1e870 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1e880 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1e890 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
1e8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e8b0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
1e8c0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
1e8d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1e8e0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
1e8f0 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
1e900 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
1e910 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
1e920 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
1e930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e940 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1e950 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e960 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e970 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1e980 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1e990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e9a0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
1e9b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1e9c0 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
1e9d0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1e9e0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1e9f0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1ea00 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
1ea10 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
1ea20 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
1ea30 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
1ea40 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
1ea50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1ea60 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
1ea70 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
1ea80 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1ea90 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
1eaa0 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
1eab0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
1eac0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1ead0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1eaf0 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
1eb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1eb10 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1eb20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
1eb30 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1eb40 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
1eb50 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
1eb60 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1eb70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1eb80 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
1eb90 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
1eba0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
1ebb0 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
1ebc0 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71     if( *pPgno>sq
1ebd0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1ebe0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1ebf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ec00 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66  /* Free page off
1ec10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1ec20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
1ec30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ec40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ec50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ec60 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1ec70 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
1ec80 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
1ec90 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
1eca0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
1ecb0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
1ecc0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ecd0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
1ece0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
1ecf0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
1ed00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
1ed10 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
1ed20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1ed30 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1ed40 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
1ed50 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
1ed60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1ed70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
1ed80 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1ed90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1eda0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1edb0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
1edc0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   1);.          i
1edd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ede0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1edf0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1ee00 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67  Rollback((*ppPag
1ee10 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
1ee20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1ee30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ee40 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
1ee50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1ee60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ee70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ee80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1ee90 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
1eea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1eeb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1eec0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1eed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1eee0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1eef0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
1ef00 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
1ef10 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
1ef20 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
1ef30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ef40 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
1ef50 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1ef60 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
1ef70 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
1ef80 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
1ef90 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70  e file */.    *p
1efa0 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 50 61  Pgno = sqlite3Pa
1efb0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1efc0 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a  ->pPager) + 1;..
1efd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1efe0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1eff0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1f000 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nc ){.      /* A
1f010 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68 61  n incr-vacuum ha
1f020 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77 69  s already run wi
1f030 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
1f040 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20  ction. So the.  
1f050 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20 61      ** page to a
1f060 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20 66  llocate is not f
1f070 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61 6c  rom the physical
1f080 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1f090 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  , but.      ** a
1f0a0 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a  t pBt->nTrunc. .
1f0b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a        */.      *
1f0c0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72  pPgno = pBt->nTr
1f0d0 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  unc+1;.      if(
1f0e0 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
1f0f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f100 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50 67  ){.        (*pPg
1f110 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  no)++;.      }. 
1f120 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1f130 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
1f140 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1f150 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
1f160 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
1f170 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
1f180 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
1f190 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
1f1a0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
1f1b0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1f1c0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
1f1d0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
1f1e0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
1f1f0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
1f200 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
1f210 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
1f220 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
1f230 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
1f240 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
1f250 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
1f260 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
1f270 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1f280 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
1f290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1f2a0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1f2b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1f2c0 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1f2d0 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
1f2e0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
1f2f0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a  _PAGE(pBt) ){ (*
1f300 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20  pPgno)++; }.    
1f310 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  }.    if( pBt->n
1f320 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  Trunc ){.      p
1f330 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50  Bt->nTrunc = *pP
1f340 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  gno;.    }.#endi
1f350 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
1f360 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1f370 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1f380 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f390 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1f3a0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1f3b0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1f3c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1f3d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f3e0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1f3f0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1f400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1f420 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1f430 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
1f440 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1f450 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1f460 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
1f470 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1f480 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1f490 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f4a0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
1f4b0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
1f4c0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
1f4d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1f4e0 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  vTrunk);.  retur
1f4f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1f500 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65  dd a page of the
1f510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1f520 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1f530 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  **.** sqlite3Pag
1f540 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54  erUnref() is NOT
1f550 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67   called for pPag
1f560 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f570 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
1f580 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53  e *pPage){.  BtS
1f590 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1f5a0 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61  ge->pBt;.  MemPa
1f5b0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1f5c0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20  ->pPage1;.  int 
1f5d0 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20  rc, n, k;..  /* 
1f5e0 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65  Prepare the page
1f5f0 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a   for freeing */.
1f600 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f610 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1f620 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1f630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f640 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20  ge->pgno>1 );.  
1f650 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1f660 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
1f670 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29  (pPage->pParent)
1f680 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ;.  pPage->pPare
1f690 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  nt = 0;..  /* In
1f6a0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1f6b0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
1f6c0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
1f6d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f6e0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1f6f0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1f700 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20  eturn rc;.  n = 
1f710 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1f720 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1f730 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1f740 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31  ->aData[36], n+1
1f750 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1f760 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
1f770 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
1f780 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1f790 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1f7a0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
1f7b0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79   then.  ** alway
1f7c0 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
1f7d0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
1f7e0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
1f7f0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
1f800 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f810 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1f820 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1f830 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
1f840 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
1f850 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
1f860 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
1f870 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f880 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f890 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1f8a0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
1f8b0 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
1f8c0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
1f8d0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
1f8e0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1f8f0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
1f900 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ee..  */.  if( p
1f910 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1f920 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
1f930 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d  pPut(pBt, pPage-
1f940 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52  >pgno, PTRMAP_FR
1f950 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  EEPAGE, 0);.    
1f960 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f970 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
1f980 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
1f990 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1f9a0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1f9b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1f9c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f9d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1f9e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f9f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73  urn rc;.    mems
1fa00 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1fa10 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34   0, 8);.    put4
1fa20 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1fa30 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1fa40 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45  pgno);.    TRACE
1fa50 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
1fa60 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65   first\n", pPage
1fa70 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
1fa80 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20  e{.    /* Other 
1fa90 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61  free pages alrea
1faa0 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69  dy exist.  Retri
1fab0 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75  ve the first tru
1fac0 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f  nk page.    ** o
1fad0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
1fae0 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20  nd find out how 
1faf0 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68  many leaves it h
1fb00 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  as. */.    MemPa
1fb10 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20  ge *pTrunk;.    
1fb20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1fb30 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65  eGetPage(pBt, ge
1fb40 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1fb50 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72  aData[32]), &pTr
1fb60 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
1fb70 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1fb80 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74  .    k = get4byt
1fb90 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1fba0 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e  [4]);.    if( k>
1fbb0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
1fbc0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
1fbd0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20  /* The trunk is 
1fbe0 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20  full.  Turn the 
1fbf0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
1fc00 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20   into a new.    
1fc10 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
1fc20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 20  with no leaves. 
1fc30 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1fc40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fc50 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1fc60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1fc70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fc80 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1fc90 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e  ge->aData, pTrun
1fca0 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  k->pgno);.      
1fcb0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1fcc0 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
1fcd0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1fce0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1fcf0 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1fd00 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  o);.        TRAC
1fd10 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1fd20 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
1fd30 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
1fd40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fd50 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70    pPage->pgno, p
1fd60 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
1fd70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1fd80 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20 20   if( k<0 ){.    
1fd90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1fda0 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
1fdb0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74  {.      /* Add t
1fdc0 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70  he newly freed p
1fdd0 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e  age as a leaf on
1fde0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75   the current tru
1fdf0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  nk */.      rc =
1fe00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fe10 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1fe20 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
1fe30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fe40 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1fe50 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1fe60 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20  4], k+1);.      
1fe70 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
1fe80 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d  nk->aData[8+k*4]
1fe90 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1fea0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
1feb0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
1fec0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1fed0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
1fee0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64  ->pDbPage);.#end
1fef0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
1ff00 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1ff10 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
1ff20 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
1ff30 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
1ff40 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1ff50 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1ff60 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
1ff70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ff80 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
1ff90 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
1ffa0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1ffb0 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
1ffc0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
1ffd0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
1ffe0 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
1fff0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
20000 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
20010 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
20020 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
20030 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
20040 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
20050 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67  l;.  int ovflPag
20060 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
20070 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20080 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
20090 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
200a0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
200b0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
200c0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
200d0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
200e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
200f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
20100 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
20110 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
20120 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
20130 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
20140 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
20150 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
20160 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61  flow]);.  ovflPa
20170 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
20180 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
20190 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
201a0 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
201b0 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
201c0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
201d0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
201e0 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
201f0 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
20200 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
20210 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
20220 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  l;.    if( ovflP
20230 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67  gno==0 || ovflPg
20240 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50  no>sqlite3PagerP
20250 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
20260 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
20270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20280 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
20290 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76  ..    rc = getOv
202a0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
202b0 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
202c0 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26  , (nOvfl==0)?0:&
202d0 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69  ovflPgno);.    i
202e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
202f0 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  c;.    rc = free
20300 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
20310 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20320 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
20330 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
20340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
20350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20360 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
20370 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
20380 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
20390 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
203a0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
203b0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
203c0 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
203d0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
203e0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
203f0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
20400 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
20410 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
20420 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
20430 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
20440 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
20450 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
20460 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
20470 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
20480 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
20490 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
204a0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
204b0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
204c0 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
204d0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
204e0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
204f0 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
20500 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
20510 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
20520 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
20530 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
20540 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
20550 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
20560 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
20570 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
20580 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
20590 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
205a0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
205b0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
205c0 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
205d0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
205e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
205f0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
20600 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
20610 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
20620 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
20630 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
20640 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
20650 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
20660 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
20670 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
20680 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
20690 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
206a0 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
206b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
206e0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
206f0 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
20700 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
20710 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
20720 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
20730 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
20740 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
20750 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
20760 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
20770 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
20780 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
20790 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
207a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
207b0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
207c0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
207d0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
207e0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
207f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20800 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
20810 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
20820 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
20830 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
20840 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
20850 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
20860 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
20870 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
20880 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
20890 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
208a0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
208b0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
208c0 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
208d0 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
208e0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
208f0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
20900 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
20910 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
20920 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
20930 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
20940 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
20950 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
20960 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
20970 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
20980 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
20990 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
209a0 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44  ( info.nData==nD
209b0 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a  ata+nZero );.  .
209c0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
209d0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
209e0 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
209f0 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
20a00 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
20a10 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
20a20 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
20a30 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
20a40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
20a50 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
20a60 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
20a70 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65  ;.    nSrc = nKe
20a80 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
20a90 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
20aa0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
20ab0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
20ac0 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
20ad0 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
20ae0 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
20af0 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
20b00 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
20b10 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
20b20 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
20b30 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20 30   int isExact = 0
20b40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20b50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20b60 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
20b70 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
20b80 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
20b90 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
20ba0 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
20bb0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
20bc0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
20bd0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
20be0 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
20bf0 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
20c00 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
20c10 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
20c20 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
20c30 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
20c40 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
20c50 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
20c60 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a  ( pgnoOvfl>1 ){.
20c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 45            /* isE
20c80 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20  xact = 1; */.   
20c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
20ca0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
20cb0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
20cc0 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
20cd0 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
20ce0 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a 23  vfl, isExact);.#
20cf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20d00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20d10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
20d20 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
20d30 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
20d40 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
20d50 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
20d60 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
20d70 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
20d80 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
20d90 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
20da0 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
20db0 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
20dc0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
20dd0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
20de0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
20df0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
20e00 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
20e10 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
20e20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
20e30 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
20e40 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
20e50 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
20e60 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
20e70 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
20e80 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
20e90 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
20ea0 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
20eb0 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
20ec0 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
20ed0 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
20ee0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
20ef0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
20f00 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
20f10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20f20 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
20f30 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
20f40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
20f50 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
20f60 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
20f70 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
20f80 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
20f90 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
20fa0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
20fb0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
20fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
20fd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
20fe0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
20ff0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21000 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21010 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21020 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21030 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
21040 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
21060 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
21070 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
21080 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
21090 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
210a0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
210b0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
210c0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
210d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
210e0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
210f0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
21100 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
21110 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
21120 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
21130 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
21140 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
21150 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
21160 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
21170 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ;.    if( nSrc>0
21180 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
21190 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
211a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
211b0 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
211c0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
211d0 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
211e0 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
211f0 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
21200 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
21210 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
21220 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
21230 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
21240 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
21250 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
21260 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
21270 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
21280 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
21290 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
212a0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
212b0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
212c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
212d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
212e0 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ge the MemPage.p
212f0 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f  Parent pointer o
21300 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73 65  n the page whose
21310 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69   number is.** gi
21320 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
21330 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68  d argument so th
21340 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  at MemPage.pPare
21350 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  nt holds the.** 
21360 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74  pointer in the t
21370 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  hird argument..*
21380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
21390 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61 72  arentPage(BtShar
213a0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
213b0 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  no, MemPage *pNe
213c0 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64 78  wParent, int idx
213d0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
213e0 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70  his;.  DbPage *p
213f0 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
21400 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21410 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
21420 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21430 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  NewParent!=0 );.
21440 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
21450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
21470 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
21480 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
21490 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
214a0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
214b0 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
214c0 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d  {.    pThis = (M
214d0 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
214e0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
214f0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
21500 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b  pThis->isInit ){
21510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21520 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  This->aData==sql
21530 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
21540 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  (pDbPage) );.   
21550 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50     if( pThis->pP
21560 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e  arent!=pNewParen
21570 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
21580 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
21590 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
215a0 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65  ref(pThis->pPare
215b0 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
215c0 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61        pThis->pPa
215d0 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e  rent = pNewParen
215e0 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
215f0 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50  e3PagerRef(pNewP
21600 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
21610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
21620 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20  This->idxParent 
21630 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  = idx;.    }.   
21640 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
21650 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
21660 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21670 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21680 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
21690 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65  Vacuum ){.    re
216a0 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
216b0 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  Bt, pgno, PTRMAP
216c0 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65  _BTREE, pNewPare
216d0 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23  nt->pgno);.  }.#
216e0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
216f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
21700 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21710 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
21720 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
21730 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e  of pPage to poin
21740 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61  t back.** to pPa
21750 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ge..**.** In oth
21760 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76  er words, for ev
21770 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ery child of pPa
21780 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72  ge, invoke repar
21790 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20  entPage().** to 
217a0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 65  make sure that e
217b0 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20  ach child knows 
217c0 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69 74  that pPage is it
217d0 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  s parent..**.** 
217e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
217f0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79  s called after y
21800 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20  ou memcpy() one 
21810 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f  page into.** ano
21820 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
21830 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c  int reparentChil
21840 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  dPages(MemPage *
21850 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
21860 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21870 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
21880 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21890 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
218a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
218b0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
218c0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
218d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74  Page->leaf ) ret
218e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
218f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
21900 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
21910 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
21920 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
21930 20 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65   i);.    rc = re
21940 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
21950 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
21960 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
21970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21980 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
21990 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65   }.  rc = repare
219a0 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
219b0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
219c0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
219d0 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20  set+8]), .      
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
219f0 61 67 65 2c 20 69 29 3b 0a 20 20 70 50 61 67 65  age, i);.  pPage
21a00 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
21a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21a20 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
21a30 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
21a40 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
21a50 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
21a60 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
21a70 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
21a80 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
21a90 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
21aa0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
21ab0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
21ac0 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
21ad0 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
21ae0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
21af0 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
21b00 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
21b10 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
21b20 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
21b30 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
21b40 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
21b50 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
21b60 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
21b70 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
21b80 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
21b90 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
21ba0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21bb0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
21bc0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
21bd0 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
21be0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
21bf0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
21c00 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
21c10 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
21c20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
21c30 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
21c40 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
21c50 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
21c60 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
21c70 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
21c80 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
21c90 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
21ca0 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
21cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21cc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
21cd0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
21ce0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
21cf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
21d00 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
21d10 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
21d20 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
21d30 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70  .  ptr = &data[p
21d40 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
21d50 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20   + 2*idx];.  pc 
21d60 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
21d70 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 31 30  .  assert( pc>10
21d80 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65   && pc+sz<=pPage
21d90 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
21da0 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65  e );.  freeSpace
21db0 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
21dc0 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20  .  for(i=idx+1; 
21dd0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
21de0 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20  i++, ptr+=2){.  
21df0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32    ptr[0] = ptr[2
21e00 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  ];.    ptr[1] = 
21e10 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50  ptr[3];.  }.  pP
21e20 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
21e30 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
21e40 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
21e50 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
21e60 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
21e70 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d  e += 2;.  pPage-
21e80 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d  >idxShift = 1;.}
21e90 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
21ea0 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
21eb0 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
21ec0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
21ed0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
21ee0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
21ef0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
21f00 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
21f10 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
21f20 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
21f30 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
21f40 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
21f50 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
21f60 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
21f70 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
21f80 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
21f90 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
21fa0 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
21fb0 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
21fc0 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
21fd0 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
21fe0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
21ff0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
22000 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
22010 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
22020 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
22030 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
22040 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
22050 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
22060 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
22070 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
22080 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
22090 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
220a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
220b0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
220c0 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
220d0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
220e0 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
220f0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
22100 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
22110 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
22120 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
22130 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
22140 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
22150 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
22160 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
22170 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
22180 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
22190 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
221a0 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
221b0 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
221c0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
221d0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
221e0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
221f0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
22200 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
22210 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
22220 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
22230 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
22240 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
22250 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
22260 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
22270 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
22280 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
22290 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
222a0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
222b0 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
222c0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
222d0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
222e0 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b  eded */.  u8 nSk
222f0 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ip          /* D
22300 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  o not write the 
22310 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
22320 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  s of the cell */
22330 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20  .){.  int idx;  
22340 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
22350 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
22360 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
22370 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
22380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22390 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
223a0 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
223b0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
223c0 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   of content for 
223d0 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61  any cell in data
223e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  [] */.  int end;
223f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
22400 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
22410 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
22420 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
22430 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
22440 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
22450 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
22460 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
22470 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
22480 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
22490 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
224a0 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61  data[] of the pa
224b0 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
224c0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
224d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
224e0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
224f0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
22500 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
22510 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
22520 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
22530 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
22540 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
22550 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
22560 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
22570 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
22580 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
22590 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
225a0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
225b0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  w );.  assert( s
225c0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
225d0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
225e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
225f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
22600 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
22610 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
22620 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
22630 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
22640 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
22650 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
22660 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
22670 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
22680 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
22690 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
226a0 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
226b0 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
226c0 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66  assert( j<sizeof
226d0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
226e0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
226f0 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50  fl[0]) );.    pP
22700 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
22710 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
22720 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
22730 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50  .idx = i;.    pP
22740 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  age->nFree = 0;.
22750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
22760 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22770 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
22780 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
22790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
227a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
227b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
227c0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
227d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
227e0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
227f0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
22800 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
22810 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
22820 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
22830 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
22840 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
22850 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
22860 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
22870 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
22880 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
22890 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
228a0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
228b0 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
228c0 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
228d0 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
228e0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
228f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22900 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
22910 63 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67  c;.      top = g
22920 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
22930 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
22940 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
22950 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
22960 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
22970 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
22980 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
22990 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
229a0 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
229b0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
229c0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
229d0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
229e0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20  e->nFree -= 2;. 
229f0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
22a00 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
22a10 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
22a20 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e  p);.    for(j=en
22a30 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a  d-2, ptr=&data[j
22a40 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20  ]; j>ins; j-=2, 
22a50 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70  ptr-=2){.      p
22a60 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b  tr[0] = ptr[-2];
22a70 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  .      ptr[1] = 
22a80 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[-1];.    }. 
22a90 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
22aa0 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
22ab0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
22ac0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
22ad0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
22ae0 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b  e->idxShift = 1;
22af0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22b00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
22b10 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
22b20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
22b30 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
22b40 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
22b50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
22b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
22b70 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
22b80 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
22b90 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
22ba0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
22bb0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
22bc0 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e   */.      CellIn
22bd0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73  fo info;.      s
22be0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
22bf0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
22c00 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
22c10 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
22c20 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
22c30 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
22c40 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
22c50 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  oad );.      if(
22c60 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
22c70 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
22c80 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
22c90 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
22ca0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
22cb0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
22cc0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
22cd0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
22ce0 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
22cf0 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  >pBt, pgnoOvfl, 
22d00 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
22d10 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
22d20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
22d30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
22d40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
22d50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
22d60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22d70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
22d80 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
22d90 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
22da0 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
22db0 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
22dc0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
22dd0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
22de0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
22df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22e00 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
22e10 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
22e20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
22e30 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
22e40 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
22e50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
22e60 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
22e70 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
22e80 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
22e90 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
22ea0 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
22eb0 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
22ec0 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
22ed0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
22ee0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
22ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
22f00 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
22f10 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20  int totalSize;  
22f20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
22f30 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
22f40 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
22f50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22f60 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
22f70 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20   int cellptr;   
22f80 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
22f90 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
22fa0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
22fb0 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
22fc0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
22fd0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
22fe0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
22ff0 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   Data for the pa
23000 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
23010 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
23020 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
23030 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23040 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
23050 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f 74  >mutex) );.  tot
23060 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f  alSize = 0;.  fo
23070 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
23080 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53  i++){.    totalS
23090 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ize += aSize[i];
230a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
230b0 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c  otalSize+2*nCell
230c0 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  <=pPage->nFree )
230d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
230e0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
230f0 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
23100 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
23110 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
23120 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
23130 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
23140 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
23150 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
23160 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20    if( nCell ){. 
23170 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c     cellbody = al
23180 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
23190 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  e, totalSize);. 
231a0 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
231b0 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ody>0 );.    ass
231c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
231d0 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a  e >= 2*nCell );.
231e0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
231f0 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20   -= 2*nCell;.   
23200 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
23210 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
23220 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
23230 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
23240 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
23250 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
23260 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
23270 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c  e[i]);.      cel
23280 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20  lptr += 2;.     
23290 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69   cellbody += aSi
232a0 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ze[i];.    }.   
232b0 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
232c0 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  y==pPage->pBt->u
232d0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d  sableSize );.  }
232e0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
232f0 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nCell;.}../*.*
23300 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23310 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
23320 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
23330 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
23340 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
23350 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
23360 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
23370 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
23380 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
23390 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
233a0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
233b0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
233c0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
233d0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
233e0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
233f0 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
23400 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
23410 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
23420 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
23430 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
23440 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
23450 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
23460 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
23470 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
23480 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
23490 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
234a0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
234b0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
234c0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
234d0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
234e0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
234f0 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
23500 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
23510 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
23520 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
23530 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
23540 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
23550 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
23560 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
23570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23580 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
23590 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
235a0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
235b0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
235c0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
235d0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
235e0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
235f0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
23600 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
23610 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
23620 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e  ge*, int);..#ifn
23630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23640 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
23650 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
23660 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
23670 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
23680 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
23690 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
236a0 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
236b0 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
236c0 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
236d0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
236e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
236f0 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
23700 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
23710 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
23720 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
23730 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
23740 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68  rying balance th
23750 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
23760 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
23770 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
23780 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
23790 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
237a0 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
237b0 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
237c0 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
237d0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
237e0 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
237f0 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
23800 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
23810 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
23820 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
23830 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
23840 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
23850 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
23860 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
23870 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
23880 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
23890 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
238a0 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
238b0 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
238c0 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
238d0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
238e0 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
238f0 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
23900 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
23910 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
23920 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
23930 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
23940 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
23950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23960 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
23970 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65  mPage *pPage, Me
23980 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b  mPage *pParent){
23990 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
239a0 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67  Page *pNew;.  Pg
239b0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
239c0 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73   *pCell;.  u16 s
239d0 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
239e0 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72  o info;.  BtShar
239f0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
23a00 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
23a10 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
23a20 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
23a30 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
23a40 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
23a50 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
23a80 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
23a90 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
23aa0 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
23ab0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
23ac0 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
23ad0 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73  er cell */..  as
23ae0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
23af0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
23b00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
23b10 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
23b20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
23b30 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
23b40 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
23b50 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
23b60 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
23b70 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
23b80 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
23b90 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
23ba0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
23bb0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
23bc0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
23bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
23be0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65  rn rc;.  }.  pCe
23bf0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66  ll = pPage->aOvf
23c00 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a  l[0].pCell;.  sz
23c10 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
23c20 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
23c30 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65  ;.  zeroPage(pNe
23c40 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  w, pPage->aData[
23c50 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50  0]);.  assembleP
23c60 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
23c70 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20  ell, &szCell);. 
23c80 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
23c90 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  w = 0;..  /* Set
23ca0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
23cb0 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
23cc0 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65  ed page to pPare
23cd0 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70  nt. */.  pNew->p
23ce0 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
23cf0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
23d00 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
23d10 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  Page);..  /* pPa
23d20 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
23d30 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
23d40 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
23d50 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20  ge this.  ** so 
23d60 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63  that the right-c
23d70 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20  hild is the new 
23d80 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  page allocated a
23d90 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50  bove and.  ** pP
23da0 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
23db0 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
23dc0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23dd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
23de0 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
23df0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
23e00 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73  e->nCell-1);.  s
23e10 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
23e20 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
23e30 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
23e40 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
23e50 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43  pParent, parentC
23e60 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
23e70 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72  y, 0, 0, 0, &par
23e80 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  entSize);.  if( 
23e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23ea0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23eb0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61    }.  assert( pa
23ec0 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20  rentSize<64 );. 
23ed0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
23ee0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
23ef0 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  Idx, parentCell,
23f00 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20   parentSize, 0, 
23f10 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
23f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
23f30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
23f40 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
23f50 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
23f60 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
23f70 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75  age->pgno);.  pu
23f80 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
23f90 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
23fa0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
23fb0 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66  noNew);..#ifndef
23fc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
23fd0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
23fe0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
23ff0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
24000 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
24010 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74  ter map.  ** wit
24020 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
24030 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
24040 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
24050 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20   the .  ** cell 
24060 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
24070 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
24080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
24090 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
240a0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
240b0 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
240c0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
240d0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
240e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
240f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
24100 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
24110 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pNew, 0);.    }.
24120 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
24140 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
24150 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
24160 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  c;.    }.  }.#en
24170 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  dif..  /* Releas
24180 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
24190 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  to the new page 
241a0 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20  and balance the 
241b0 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a  parent page,.  *
241c0 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64 69  * in case the di
241d0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72  vider cell inser
241e0 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f  ted caused it to
241f0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
24200 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
24210 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65  Page(pNew);.  re
24220 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61  turn balance(pPa
24230 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64  rent, 0);.}.#end
24240 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
24250 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
24260 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
24270 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
24280 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
24290 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
242a0 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
242b0 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
242c0 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
242d0 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
242e0 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
242f0 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
24300 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
24310 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
24320 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
24330 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
24340 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
24350 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
24360 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
24370 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
24380 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
24390 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
243a0 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
243b0 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
243c0 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
243d0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
243e0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
243f0 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
24400 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
24410 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
24420 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
24430 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
24440 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
24450 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
24460 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
24470 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
24480 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
24490 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
244a0 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
244b0 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
244c0 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
244d0 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
244e0 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
244f0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
24500 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
24510 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
24520 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
24530 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
24540 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
24550 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
24560 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
24570 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
24580 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
24590 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
245a0 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
245b0 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
245c0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
245d0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
245e0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
245f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24600 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
24610 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
24620 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
24630 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
24640 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
24650 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
24660 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
24670 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
24680 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
24690 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
246a0 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
246b0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
246c0 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
246d0 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
246e0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
246f0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
24700 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
24710 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
24720 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
24730 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
24740 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
24750 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
24760 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
24770 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
24780 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
24790 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
247a0 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
247b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
247c0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
247d0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
247e0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
247f0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
24800 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
24810 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
24820 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
24830 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
24840 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
24850 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
24860 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
24870 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
24880 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
24890 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
248a0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
248b0 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53  f pPage */.  BtS
248c0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
248d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
248e0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
248f0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
24900 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24910 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
24920 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
24930 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
24940 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
24950 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
24960 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
24970 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
24980 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
249b0 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
249c0 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20  /.  int nNew;   
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
249f0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
24a00 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
24a30 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
24a40 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
24a70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
24aa0 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
24ab0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
24ac0 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24ae0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
24af0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
24b00 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
24b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24b20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
24b30 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
24b40 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
24b50 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
24b60 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
24b70 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
24b80 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
24b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ba0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
24bb0 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
24bc0 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
24bd0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
24be0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
24bf0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
24c00 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
24c10 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
24c20 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
24c30 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
24c40 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
24c50 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
24c60 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
24c70 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
24c80 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
24c90 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
24ca0 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d  /.  int iSpace =
24cb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24cc0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
24cd0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b   byte of aSpace[
24ce0 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
24cf0 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
24d00 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
24d10 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
24d20 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
24d30 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  noOld[NB];      
24d40 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
24d50 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
24d60 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  age in apOld[] *
24d70 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
24d80 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
24d90 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
24da0 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
24db0 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
24dc0 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
24dd0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
24de0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
24df0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
24e00 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  cing */.  Pgno p
24e10 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  gnoNew[NB+2];   
24e20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
24e30 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
24e40 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20  page in apNew[] 
24e50 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
24e60 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
24e70 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
24e80 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
24e90 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
24ea0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
24eb0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
24ec0 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
24ed0 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
24ee0 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
24ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24f00 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
24f10 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
24f20 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
24f30 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f50 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
24f60 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
24f70 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
24f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
24f90 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
24fa0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
24fb0 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79  ] */.  u8 *aCopy
24fc0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
24fd0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
24fe0 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
24ff0 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
25000 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20  8 *aSpace;      
25010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25020 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70  pace to hold cop
25030 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
25040 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66  cells */.#ifndef
25050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
25060 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46  OVACUUM.  u8 *aF
25070 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
25080 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25090 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
250a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
250b0 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20   );..  /* .  ** 
250c0 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20  Find the parent 
250d0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
250e0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
250f0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
25100 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
25110 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
25120 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65  DbPage) || pPage
25130 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
25140 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
25150 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20  >pBt;.  pParent 
25160 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
25170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
25180 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ent );.  if( SQL
25190 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
251a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
251b0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
251c0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
251d0 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45   rc;.  }.  TRACE
251e0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
251f0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
25200 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
25210 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
25220 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
25230 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
25240 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
25250 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
25260 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
25270 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
25280 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
25290 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
252a0 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
252b0 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
252c0 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
252d0 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
252e0 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
252f0 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
25300 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
25310 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
25320 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
25330 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
25340 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
25350 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
25360 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
25370 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
25380 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
25390 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
253a0 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
253b0 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
253c0 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
253d0 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
253e0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
253f0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
25400 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
25410 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
25420 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
25430 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a  nOverflow==1 &&.
25440 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76        pPage->aOv
25450 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
25460 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20  ->nCell &&.     
25470 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
25480 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
25490 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
254a0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
254b0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
254c0 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
254d0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
254e0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
254f0 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
25500 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
25510 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
25520 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
25530 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
25540 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
25550 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
25560 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
25570 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61  quick(pPage, pPa
25580 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rent);.  }.#endi
25590 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  f..  if( SQLITE_
255a0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
255b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
255c0 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  e->pDbPage)) ){.
255d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
255e0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
255f0 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  nd the cell in t
25600 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
25610 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20  hose left child 
25620 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a  points back.  **
25630 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20   to pPage.  The 
25640 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69  "idx" variable i
25650 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
25660 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50  hat cell.  If pP
25670 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  age.  ** is the 
25680 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20  rightmost child 
25690 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20  of pParent then 
256a0 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65  set idx to pPare
256b0 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a  nt->nCell .  */.
256c0 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69    if( pParent->i
256d0 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50  dxShift ){.    P
256e0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67  gno pgno;.    pg
256f0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
25700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
25710 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
25720 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
25730 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
25740 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78    for(idx=0; idx
25750 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b  <pParent->nCell;
25760 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69   idx++){.      i
25770 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  f( get4byte(find
25780 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64  Cell(pParent, id
25790 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  x))==pgno ){.   
257a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
257b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
257c0 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e  sert( idx<pParen
257d0 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  t->nCell.       
257e0 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74        || get4byt
257f0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
25800 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
25810 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29  fset+8])==pgno )
25820 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
25830 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  dx = pPage->idxP
25840 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arent;.  }..  /*
25850 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  ** Initialize
25860 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68   variables so th
25870 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61  at it will be sa
25880 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20  fe to jump.  ** 
25890 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61  directly to bala
258a0 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61  nce_cleanup at a
258b0 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  ny moment..  */.
258c0 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20    nOld = nNew = 
258d0 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  0;.  sqlite3Page
258e0 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
258f0 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20  bPage);..  /*.  
25900 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20  ** Find sibling 
25910 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61  pages to pPage a
25920 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  nd the cells in 
25930 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76  pParent that div
25940 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62  ide.  ** the sib
25950 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d  lings.  An attem
25960 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
25970 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
25980 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69  n either.  ** si
25990 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f  de of pPage.  Mo
259a0 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
259b0 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
259c0 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66  ide, however, if
259d0 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72  .  ** pPage ther
259e0 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
259f0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
25a00 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
25a10 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
25a20 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
25a30 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
25a40 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
25a50 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
25a60 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d  ..  */.  nxDiv =
25a70 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28   idx - NN;.  if(
25a80 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50   nxDiv + NB > pP
25a90 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
25aa0 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72      nxDiv = pPar
25ab0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20  ent->nCell - NB 
25ac0 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  + 1;.  }.  if( n
25ad0 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78  xDiv<0 ){.    nx
25ae0 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  Div = 0;.  }.  n
25af0 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Div = 0;.  for(i
25b00 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
25b10 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
25b20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
25b30 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
25b40 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
25b50 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
25b60 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20  .      nDiv++;. 
25b70 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
25b80 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  arent->leaf );. 
25b90 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
25ba0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
25bb0 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
25bc0 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e  if( k==pParent->
25bd0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  nCell ){.      p
25be0 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
25bf0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
25c00 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
25c10 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
25c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
25c30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
25c40 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
25c50 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b  ge(pBt, pgnoOld[
25c60 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70  i], &apOld[i], p
25c70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
25c80 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
25c90 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
25ca0 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72  apOld[i]->idxPar
25cb0 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43  ent = k;.    apC
25cc0 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  opy[i] = 0;.    
25cd0 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20  assert( i==nOld 
25ce0 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20  );.    nOld++;. 
25cf0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
25d00 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
25d10 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
25d20 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rflow;.  }..  /*
25d30 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
25d40 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
25d50 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
25d60 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
25d70 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
25d80 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
25d90 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
25da0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
25db0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
25dc0 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
25dd0 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20    */.  apCell = 
25de0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
25df0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
25e00 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
25e30 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
25e40 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
25e70 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28  .     + (ROUND8(
25e80 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
25e90 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a  +pBt->pageSize)*
25ea0 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a  NB  /* aCopy */.
25eb0 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
25ec0 53 69 7a 65 2a 35 20 20 20 20 20 20 20 20 20 20  Size*5          
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ee0 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a     /* aSpace */.
25ef0 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41       + (ISAUTOVA
25f00 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73  CUUM ? nMaxCells
25f10 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20 20   : 0)           
25f20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20     /* aFrom */. 
25f30 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
25f40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
25f50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25f60 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
25f70 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
25f80 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
25f90 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
25fa0 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75  .  aCopy[0] = (u
25fb0 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
25fc0 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
25fd0 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75   ((aCopy[0] - (u
25fe0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
25ff0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
26000 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
26010 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
26020 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
26030 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
26040 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
26050 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
26060 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
26070 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
26080 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70  opy[i] - (u8*)ap
26090 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
260a0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
260b0 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
260c0 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20  .  }.  aSpace = 
260d0 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74  &aCopy[NB-1][pBt
260e0 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
260f0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
26100 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ))];.  assert( (
26110 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61  (aSpace - (u8*)a
26120 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
26130 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
26140 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
26150 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
26160 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26170 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
26180 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46  Vacuum ){.    aF
26190 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a  rom = &aSpace[5*
261a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
261b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
261c0 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70  /*.  ** Make cop
261d0 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ies of the conte
261e0 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20  nt of pPage and 
261f0 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74  its siblings int
26200 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54  o aOld[]..  ** T
26210 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
26220 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  function will us
26230 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
26240 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20  copies rather.  
26250 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
26260 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
26270 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
26280 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
26290 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  he.  ** process 
262a0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
262b0 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tten..  */.  for
262c0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
262d0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
262e0 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  *p = apCopy[i] =
262f0 20 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79   (MemPage*)aCopy
26300 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [i];.    memcpy(
26310 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  p, apOld[i], siz
26320 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
26330 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76     p->aData = (v
26340 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  oid*)&p[1];.    
26350 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c  memcpy(p->aData,
26360 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61   apOld[i]->aData
26370 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
26380 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
26390 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74   Load pointers t
263a0 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73  o all cells on s
263b0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64  ibling pages and
263c0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
263d0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  ls.  ** into the
263e0 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20   local apCell[] 
263f0 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70  array.  Make cop
26400 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  ies of the divid
26410 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
26420 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
26430 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20  d form aSpace[] 
26440 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
26450 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
26460 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
26470 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
26480 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
26490 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
264a0 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
264b0 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
264c0 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
264d0 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
264e0 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
264f0 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
26500 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
26510 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68  aSpace[].  In th
26520 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
26530 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
26540 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
26550 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
26560 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
26570 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
26580 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
26590 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
265a0 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
265b0 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
265c0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
265d0 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
265e0 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
265f0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
26600 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
26610 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
26620 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
26630 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
26640 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
26650 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
26660 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
26670 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
26680 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b   */.  nCell = 0;
26690 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
266a0 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a  n = pPage->leaf*
266b0 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
266c0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
266d0 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  && pPage->leaf;.
266e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
266f0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
26700 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
26710 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[i];.    int 
26720 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
26730 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
26740 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
26750 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
26760 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
26770 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
26780 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
26790 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
267a0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
267b0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
267c0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
267d0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
267e0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64  l[nCell]);.#ifnd
267f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26800 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
26810 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26820 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  uum ){.        i
26830 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46  nt a;.        aF
26840 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a  rom[nCell] = i;.
26850 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b          for(a=0;
26860 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   a<pOld->nOverfl
26870 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; a++){.      
26880 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f      if( pOld->aO
26890 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70  vfl[a].pCell==ap
268a0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20  Cell[nCell] ){. 
268b0 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d             aFrom
268c0 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
268d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
268e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
268f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26900 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 43  .#endif.      nC
26910 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
26920 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b   if( i<nOld-1 ){
26930 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
26940 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
26950 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
26960 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
26970 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
26980 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41   With the LEAFDA
26990 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74  TA flag, pParent
269a0 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79   cells hold only
269b0 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20   INTKEYs that.  
269c0 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70        ** are dup
269d0 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20  licates of keys 
269e0 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  on the child pag
269f0 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  es.  We need to 
26a00 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  remove.        *
26a10 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  * the divider ce
26a20 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74  lls from pParent
26a30 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65  , but the divide
26a40 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74  rs cells are not
26a50 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
26a60 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65  d to apCell[] be
26a70 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64  cause they are d
26a80 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69  uplicates of chi
26a90 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20  ld cells..      
26aa0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f    */.        dro
26ab0 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
26ac0 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
26ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26ae0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
26af0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
26b00 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
26b10 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
26b20 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
26b30 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
26b40 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  e[iSpace];.     
26b50 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b     iSpace += sz;
26b60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26b70 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61   iSpace<=pBt->pa
26b80 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20  geSize*5 );.    
26b90 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
26ba0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
26bb0 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
26bc0 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c  nCell] = pTemp+l
26bd0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23  eafCorrection;.#
26be0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26bf0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
26c00 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
26c10 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
26c20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
26c30 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
26c40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
26c50 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
26c60 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
26c70 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
26c80 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66  l[nCell] -= leaf
26c90 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
26ca0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
26cb0 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e  byte(pTemp)==pgn
26cc0 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20  oOld[i] );.     
26cd0 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
26ce0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
26cf0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
26d00 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
26d10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
26d20 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
26d30 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
26d40 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
26d50 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eft.          **
26d60 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
26d70 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
26d80 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
26d90 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
26da0 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c  &pOld->aData[pOl
26db0 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  d->hdrOffset+8],
26dc0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
26dd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
26de0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
26df0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
26e00 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
26e10 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
26e20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
26e30 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
26e40 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
26e50 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
26e60 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
26e70 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
26e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26e90 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
26ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26eb0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
26ec0 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
26ed0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
26ee0 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
26ef0 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
26f00 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
26f10 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
26f20 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
26f30 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
26f40 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
26f50 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
26f60 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
26f70 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
26f80 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
26f90 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
26fa0 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
26fb0 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
26fc0 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
26fd0 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
26fe0 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
26ff0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
27000 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
27010 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
27020 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
27030 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
27040 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
27050 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
27060 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
27070 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
27080 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
27090 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
270a0 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
270b0 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
270c0 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
270d0 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
270e0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
270f0 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
27100 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
27110 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
27120 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
27130 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
27140 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
27150 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
27160 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
27170 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
27180 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
27190 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
271a0 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
271b0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
271c0 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
271d0 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
271e0 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
271f0 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
27200 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
27210 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
27220 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
27230 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
27240 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
27250 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
27260 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
27270 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
27280 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
27290 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
272a0 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
272b0 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
272c0 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
272d0 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
272e0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
272f0 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
27300 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
27310 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
27320 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
27330 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
27340 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
27350 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
27360 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
27370 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
27380 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
27390 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
273a0 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
273b0 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
273c0 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
273d0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
273e0 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
273f0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
27400 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
27410 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
27420 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
27430 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
27440 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
27450 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
27460 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
27470 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
27480 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
27490 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
274a0 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
274b0 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
274c0 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
274d0 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
274e0 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
274f0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
27500 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
27510 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
27520 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
27530 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
27540 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
27550 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
27560 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
27570 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
27580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27590 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
275a0 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
275b0 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
275c0 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
275d0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
275e0 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
275f0 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
27600 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
27610 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
27620 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
27630 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
27640 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
27650 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
27660 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
27670 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
27680 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
27690 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
276a0 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
276b0 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
276c0 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
276d0 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
276e0 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
276f0 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
27700 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
27710 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
27720 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
27730 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
27740 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
27750 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
27760 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
27770 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
27780 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
27790 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
277a0 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
277b0 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20  ])>0) or we are 
277c0 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  the.  ** a virtu
277d0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
277e0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
277f0 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
27800 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
27810 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
27820 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
27830 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
27840 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
27850 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
27860 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
27870 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
27880 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
27890 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
278a0 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
278b0 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
278c0 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
278d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
278e0 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
278f0 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50    pageFlags = pP
27900 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  age->aData[0];. 
27910 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
27920 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
27930 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
27940 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
27950 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
27960 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
27970 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
27980 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20  gnoOld[i];.     
27990 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
279a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
279b0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
279c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
279d0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
279e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
279f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
27a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27a10 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
27a20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
27a30 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
27a40 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
27a50 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31  [i], pgnoNew[i-1
27a60 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
27a70 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
27a80 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27a90 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
27aa0 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
27ab0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50  .    }.    zeroP
27ac0 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
27ad0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
27ae0 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
27af0 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
27b00 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
27b10 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
27b20 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
27b30 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
27b40 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
27b50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
27b60 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
27b70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
27b80 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
27b90 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
27ba0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
27bb0 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
27bc0 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
27bd0 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
27be0 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
27bf0 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
27c00 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
27c10 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
27c20 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
27c30 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
27c40 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
27c50 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
27c60 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
27c70 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
27c80 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
27c90 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
27ca0 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
27cb0 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
27cc0 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
27cd0 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
27ce0 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
27cf0 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
27d00 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
27d10 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
27d20 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
27d30 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
27d40 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
27d50 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
27d60 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
27d70 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
27d80 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
27d90 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
27da0 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
27db0 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
27dc0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
27dd0 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
27de0 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
27df0 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
27e00 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
27e10 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
27e20 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
27e30 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75  f( pgnoNew[j]<(u
27e40 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
27e50 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
27e60 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
27e70 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20   pgnoNew[j];.   
27e80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
27e90 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
27ea0 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
27eb0 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
27ec0 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69     t = pgnoNew[i
27ed0 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  ];.      pT = ap
27ee0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  New[i];.      pg
27ef0 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e  noNew[i] = pgnoN
27f00 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
27f10 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
27f20 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67  [minI];.      pg
27f30 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b  noNew[minI] = t;
27f40 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
27f50 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
27f60 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   }.  TRACE(("BAL
27f70 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
27f80 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29   %d  new: %d(%d)
27f90 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
27fa0 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
27fb0 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c  .    pgnoOld[0],
27fc0 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
27fd0 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a  pgnoOld[1] : 0,.
27fe0 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67      nOld>=3 ? pg
27ff0 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20  noOld[2] : 0,.  
28000 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a    pgnoNew[0], sz
28010 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
28020 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d  >=2 ? pgnoNew[1]
28030 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
28040 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
28050 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f    nNew>=3 ? pgno
28060 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[2] : 0, nNew
28070 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
28080 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
28090 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30  ? pgnoNew[3] : 0
280a0 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
280b0 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
280c0 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=5 ? pgnoNew[
280d0 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  4] : 0, nNew>=5 
280e0 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
280f0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
28100 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
28110 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
28120 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
28130 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
28140 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
28150 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
28160 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
28170 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
28180 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
28190 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
281a0 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
281b0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
281c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
281d0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
281e0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
281f0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
28200 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d  rt( pNew->pgno==
28210 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20  pgnoNew[i] );.  
28220 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
28230 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
28240 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
28250 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
28260 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
28270 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
28280 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
28290 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
282a0 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
282b0 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ==0 );..#ifndef 
282c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
282d0 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66  VACUUM.    /* If
282e0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
282f0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
28300 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
28310 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
28320 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  .    ** that poi
28330 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e  nt to the siblin
28340 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61  gs that were rea
28350 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63  rranged. These c
28360 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20  an be: left.    
28370 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63  ** children of c
28380 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d  ells, the right-
28390 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67  child of the pag
283a0 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e, or overflow p
283b0 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ages.    ** poin
283c0 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e  ted to by cells.
283d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
283e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
283f0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a  ){.      for(k=j
28400 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b  ; k<cntNew[i]; k
28410 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
28420 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73  ert( k<nMaxCells
28430 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28440 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c  aFrom[k]==0xFF |
28450 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b  | apCopy[aFrom[k
28460 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ]]->pgno!=pNew->
28470 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
28480 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
28490 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b  Ovfl(pNew, k-j);
284a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
284b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
284c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
284d0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
284e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
284f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28500 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
28510 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
28520 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
28530 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
28540 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
28550 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
28560 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
28570 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
28580 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
28590 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
285a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
285b0 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65  <nNew-1 && j<nCe
285c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
285d0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
285e0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
285f0 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
28600 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
28610 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
28620 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
28630 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
28640 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
28650 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  on;.      if( !p
28660 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  New->leaf ){.   
28670 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
28680 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65  w->aData[8], pCe
28690 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ll, 4);.        
286a0 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
286b0 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
286c0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
286d0 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
286e0 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
286f0 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
28700 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
28710 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
28720 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
28730 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
28740 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
28750 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
28760 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
28770 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
28780 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
28790 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
287a0 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
287b0 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
287c0 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
287d0 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
287e0 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
287f0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
28800 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71   j--;.        sq
28810 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
28820 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
28830 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
28840 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
28850 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
28860 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43  .        fillInC
28870 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65  ell(pParent, pCe
28880 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
28890 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  , 0, 0, 0, &sz);
288a0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
288b0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
288c0 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
288d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
288e0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
288f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
28900 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
28910 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54  -= 4;.        pT
28920 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53  emp = &aSpace[iS
28930 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  pace];.        i
28940 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
28950 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
28960 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
28970 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
28980 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
28990 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
289a0 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
289b0 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
289c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
289d0 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
289e0 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
289f0 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
28a00 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
28a10 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
28a20 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
28a30 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
28a40 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
28a50 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42  ** (see sqlite3B
28a60 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
28a70 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
28a80 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
28a90 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
28aa0 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
28ab0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
28ac0 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
28ad0 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
28ae0 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
28af0 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
28b00 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
28b10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28b20 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
28b30 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
28b40 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
28b50 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
28b60 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
28b70 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
28b80 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
28b90 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
28ba0 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
28bb0 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
28bc0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
28bd0 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
28be0 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
28bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
28c00 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
28c10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
28c20 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
28c30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
28c40 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
28c50 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
28c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28c70 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
28c80 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
28c90 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
28ca0 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20   pTemp, 4);.    
28cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28cc0 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
28cd0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
28ce0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
28cf0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
28d00 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77  ent,nxDiv), pNew
28d10 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
28d20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
28d30 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
28d40 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
28d50 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
28d60 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
28d70 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
28d80 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
28d90 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
28da0 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
28db0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
28dc0 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
28dd0 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
28de0 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
28df0 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
28e00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28e10 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
28e20 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61  uum && !leafData
28e30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28e40 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
28e50 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
28e60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28e80 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
28e90 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
28ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
28eb0 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b  endif.      j++;
28ec0 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
28ed0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
28ee0 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
28ef0 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
28f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
28f10 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
28f20 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
28f30 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  EAF)==0 ){.    m
28f40 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
28f50 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
28f60 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
28f70 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
28f80 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d   }.  if( nxDiv==
28f90 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
28fa0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
28fb0 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
28fc0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
28fd0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
28fe0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
28ff0 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
29000 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
29010 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
29020 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
29030 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
29040 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
29050 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
29060 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
29070 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
29080 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
29090 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
290a0 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
290b0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
290c0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
290d0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
290e0 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
290f0 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
29100 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65    /*.  ** Repare
29110 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61  nt children of a
29120 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  ll cells..  */. 
29130 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
29140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
29150 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
29160 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ges(apNew[i]);. 
29170 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29180 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
29190 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
291a0 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
291b0 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
291c0 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
291d0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
291e0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
291f0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
29200 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
29210 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
29220 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
29230 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
29240 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
29250 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
29260 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
29270 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
29280 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
29290 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
292a0 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
292b0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
292c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
292d0 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
292e0 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
292f0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a  pParent, 0);.  .
29300 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
29310 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
29320 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
29330 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
29340 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29  te3_free(apCell)
29350 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
29360 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
29370 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
29380 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
29390 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
293a0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
293b0 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
293c0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
293d0 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43  pParent);.  TRAC
293e0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
293f0 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
29400 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
29410 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
29420 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
29430 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
29440 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ll));.  return r
29450 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
29460 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
29470 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
29480 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
29490 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
294a0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
294b0 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
294c0 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
294d0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
294e0 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
294f0 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
29500 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
29510 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d  ce_shallower(Mem
29520 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
29530 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29550 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70  The only child p
29560 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  age of pPage */.
29570 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
29580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29590 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
295a0 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e  r pChild */.  in
295b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
295c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
295d0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
295e0 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
295f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54    /* The main BT
29620 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
29630 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72  .  int mxCellPer
29640 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
29650 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
29660 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70  r of cells per p
29670 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
29680 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
29690 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
296a0 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
296b0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
296c0 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20    u16 *szCell;  
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
296e0 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
296f0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
29700 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
29710 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
29720 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
29730 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
29740 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29750 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
29760 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
29770 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
29780 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  .  mxCellPerPage
29790 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b   = MX_CELL(pBt);
297a0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
297b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43 65  te3_malloc( mxCe
297c0 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f  llPerPage*(sizeo
297d0 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31  f(u8*)+sizeof(u1
297e0 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43  6)) );.  if( apC
297f0 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
29800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
29810 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
29820 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72  apCell[mxCellPer
29830 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Page];.  if( pPa
29840 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
29850 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  /* The table is 
29860 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
29870 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22   */.    TRACE(("
29880 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74  BALANCE: empty t
29890 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  able %d\n", pPag
298a0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
298b0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
298c0 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
298d0 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
298e0 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
298f0 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  he.    ** inform
29900 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20  ation from that 
29910 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74  one child into t
29920 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20  he root page if 
29930 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
29940 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
29950 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
29960 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
29970 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
29980 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
29990 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61  is page 1, it ha
299a0 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61  s less space ava
299b0 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20  ilable than.    
299c0 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75  ** its child (du
299d0 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74  e to the 100 byt
299e0 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63  e header that oc
299f0 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69  curs at the begi
29a00 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
29a10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65  the database fle
29a20 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  ), so it might n
29a30 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f  ot be able to ho
29a40 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20  ld all of the . 
29a50 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
29a60 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  n currently cont
29a70 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69  ained in the chi
29a80 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ld.  If this is 
29a90 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65  the .    ** case
29aa0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
29ab0 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
29ac0 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
29ad0 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  ty except.    **
29ae0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
29af0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
29b00 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63  ild page.  The c
29b10 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65  hild page become
29b20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72  s.    ** the vir
29b30 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
29b40 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   tree..    */.  
29b50 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
29b60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
29b70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
29b80 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
29b90 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
29ba0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
29bb0 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c  ( pgnoChild<=sql
29bc0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
29bd0 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  nt(pPage->pBt->p
29be0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63  Pager) );.    rc
29bf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
29c00 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42  etPage(pPage->pB
29c10 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70  t, pgnoChild, &p
29c20 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69  Child, 0);.    i
29c30 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
29c40 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
29c50 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
29c60 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
29c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
29c80 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69  reeInitPage(pChi
29c90 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20  ld, pPage);.    
29ca0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29cb0 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
29cc0 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
29cd0 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
29ce0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
29cf0 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
29d00 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
29d10 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
29d20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
29d30 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
29d40 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
29d50 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
29d60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
29d70 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
29d80 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
29d90 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
29da0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
29db0 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
29dc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
29dd0 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
29de0 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
29df0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
29e00 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
29e10 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
29e20 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
29e30 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
29e40 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
29e50 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
29e60 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
29e70 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
29e80 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
29e90 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
29ea0 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
29eb0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
29ec0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
29ed0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
29ee0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65   .            ge
29ef0 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e  t4byte(&pChild->
29f00 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64  aData[pChild->hd
29f10 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
29f20 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
29f30 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
29f40 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
29f50 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
29f60 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
29f70 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
29f80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29f90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
29fa0 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
29fb0 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
29fc0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
29fd0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
29fe0 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
29ff0 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
2a000 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
2a010 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2a020 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
2a030 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
2a040 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2a050 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2a060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a070 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
2a080 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
2a090 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
2a0a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
2a0b0 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
2a0c0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  it = 0;.      pP
2a0d0 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
2a0e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2a0f0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2a100 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
2a110 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2a120 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2a130 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2a140 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
2a150 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
2a160 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
2a170 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
2a180 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
2a190 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
2a1a0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
2a1b0 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
2a1c0 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65  ChildPages(pPage
2a1d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2a1e0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2a1f0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
2a200 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2a210 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
2a220 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2a230 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2a240 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
2a250 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
2a260 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  { .        rc = 
2a270 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
2a280 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  age, i);.       
2a290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a2a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2a2b0 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
2a2c0 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
2a2d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2a2e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c  }.#endif.    rel
2a2f0 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
2a300 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f  ;.  }.end_shallo
2a310 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c  w_balance:.  sql
2a320 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c  ite3_free(apCell
2a330 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2a340 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f  }.../*.** The ro
2a350 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  ot page is overf
2a360 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ull.**.** When t
2a370 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65  his happens, Cre
2a380 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
2a390 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68  page and copy th
2a3a0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
2a3b0 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74   the root into t
2a3c0 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20  he child.  Then 
2a3d0 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  make the root.**
2a3e0 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70   page an empty p
2a3f0 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68  age with rightCh
2a400 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ild pointing to 
2a410 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64  the new.** child
2a420 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c  .   Finally, cal
2a430 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e  l balance_intern
2a440 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  al() on the new 
2a450 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73  child.** to caus
2a460 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a  e it to split..*
2a470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2a480 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
2a490 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
2a4a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a4b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
2a4c0 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
2a4d0 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
2a4e0 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f  ge *pChild;    /
2a4f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
2a500 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2a510 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2a520 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  d;     /* Page n
2a530 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
2a540 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2a550 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2a560 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
2a570 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Tree */.  int us
2a580 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  ableSize;     /*
2a590 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69   Total usable si
2a5a0 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a  ze of a page */.
2a5b0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2a5c0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2a5d0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2a5e0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61  age */.  u8 *cda
2a5f0 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
2a600 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  Content of the c
2a610 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  hild page */.  i
2a620 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
2a630 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2a640 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70  page header in p
2a650 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62  arent */.  int b
2a660 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rk;            /
2a670 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74  * Offset to cont
2a680 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ent of first cel
2a690 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a  l in parent */..
2a6a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a6b0 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20  >pParent==0 );. 
2a6c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a6d0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
2a6e0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2a6f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2a700 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a710 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a720 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2a730 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43  reePage(pBt, &pC
2a740 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64  hild, &pgnoChild
2a750 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30  , pPage->pgno, 0
2a760 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2a770 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
2a780 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2a790 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
2a7a0 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
2a7b0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
2a7c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
2a7d0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2a7e0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
2a7f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2a800 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65    brk = get2byte
2a810 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
2a820 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64    cdata = pChild
2a830 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70  ->aData;.  memcp
2a840 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68  y(cdata, &data[h
2a850 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c  dr], pPage->cell
2a860 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
2a870 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65  nCell-hdr);.  me
2a880 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d  mcpy(&cdata[brk]
2a890 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
2a8a0 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20  ableSize-brk);. 
2a8b0 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2a8c0 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
2a8d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2a8e0 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64  eInitPage(pChild
2a8f0 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  , pPage);.  if( 
2a900 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2a910 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d  edeeper_out;.  m
2a920 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
2a930 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66  vfl, pPage->aOvf
2a940 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  l, pPage->nOverf
2a950 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65  low*sizeof(pPage
2a960 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
2a970 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2a980 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  w = pPage->nOver
2a990 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69  flow;.  if( pChi
2a9a0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
2a9b0 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72  .    pChild->nFr
2a9c0 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ee = 0;.  }.  as
2a9d0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
2a9e0 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ell==pPage->nCel
2a9f0 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  l );.  zeroPage(
2aa00 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2aa10 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
2aa20 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
2aa30 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2aa40 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2aa50 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
2aa60 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2aa70 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
2aa80 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67  into %d\n", pPag
2aa90 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  e->pgno, pChild-
2aaa0 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66  >pgno));.#ifndef
2aab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2aac0 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
2aad0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2aae0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2aaf0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2ab00 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  Bt, pChild->pgno
2ab10 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2ab20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
2ab30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2ab40 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
2ab50 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
2ab60 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
2ab70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
2ab80 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
2ab90 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20  pChild, i);.    
2aba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2abb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2abc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2abd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
2abe0 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  if.  rc = balanc
2abf0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64  e_nonroot(pChild
2ac00 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65  );..balancedeepe
2ac10 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  r_out:.  release
2ac20 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2ac30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ac40 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74 68  .** Decide if th
2ac50 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65 65  e page pPage nee
2ac60 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
2ac70 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67  d.  If balancing
2ac80 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c   is.** required,
2ac90 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70   call the approp
2aca0 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
2acb0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
2acc0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d  ic int balance(M
2acd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2ace0 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e  nt insert){.  in
2acf0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ad00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2ad10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2ad20 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2ad30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
2ad40 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a  ->pParent==0 ){.
2ad50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ad60 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2ad70 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ad80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ad90 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
2ada0 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
2adb0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65   rc = balance_de
2adc0 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20  eper(pPage);.   
2add0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2ade0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2adf0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
2ae00 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2ae10 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67  e_shallower(pPag
2ae20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
2ae30 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
2ae40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
2ae50 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73 65   .        (!inse
2ae60 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  rt && pPage->nFr
2ae70 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ee>pPage->pBt->u
2ae80 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29  sableSize*2/3) )
2ae90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2aea0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61  ance_nonroot(pPa
2aeb0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
2aec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2aed0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2aee0 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72  e checks all cur
2aef0 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20  sors that point 
2af00 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f  to table pgnoRoo
2af10 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  t..** If any of 
2af20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65  those cursors we
2af30 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  re opened with w
2af40 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69  rFlag==0 in a di
2af50 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  fferent.** datab
2af60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28  ase connection (
2af70 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2af80 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65  ction that share
2af90 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  s the pager.** c
2afa0 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75  ache with the cu
2afb0 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
2afc0 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72  ) and that other
2afd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
2afe0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65  is not in the Re
2aff0 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73  adUncommmitted s
2b000 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20  tate, then this 
2b010 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2b020 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .** SQLITE_LOCKE
2b030 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69  D..**.** In addi
2b040 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67  tion to checking
2b050 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20   for read-locks 
2b060 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c 6f  (where a read-lo
2b070 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63  ck .** means a c
2b080 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69 74  ursor opened wit
2b090 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68 69  h wrFlag==0) thi
2b0a0 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d  s routine also m
2b0b0 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74  oves.** all writ
2b0c0 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61  e cursors so tha
2b0d0 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  t they are point
2b0e0 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
2b0f0 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65  irst Cell on the
2b100 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69   root page.  Thi
2b110 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
2b120 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74  ecause an insert
2b130 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d   .** or delete m
2b140 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
2b150 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2b160 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c  on a page or del
2b170 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e  ete.** a page en
2b180 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f  tirely and we do
2b190 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61   not want to lea
2b1a0 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a  ve any cursors .
2b1b0 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e  ** pointing to n
2b1c0 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65  on-existant page
2b1d0 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  s or cells..*/.s
2b1e0 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
2b1f0 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  eadLocks(Btree *
2b200 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e  pBtree, Pgno pgn
2b210 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  oRoot, BtCursor 
2b220 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74  *pExclude){.  Bt
2b230 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53  Cursor *p;.  BtS
2b240 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74  hared *pBt = pBt
2b250 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  ree->pBt;.  sqli
2b260 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65  te3 *db = pBtree
2b270 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
2b280 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2b290 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29  sMutex(pBtree) )
2b2a0 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
2b2b0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
2b2c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
2b2d0 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f  p==pExclude ) co
2b2e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2b2f0 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  p->eState!=CURSO
2b300 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e  R_VALID ) contin
2b310 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ue;.    if( p->p
2b320 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f  gnoRoot!=pgnoRoo
2b330 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2b340 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d    if( p->wrFlag=
2b350 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2b360 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70  te3 *dbOther = p
2b370 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
2b380 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d      if( dbOther=
2b390 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28  =0 ||.         (
2b3a0 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28  dbOther!=db && (
2b3b0 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26  dbOther->flags &
2b3c0 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2b3d0 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a  mmitted)==0) ){.
2b3e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2b3f0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
2b400 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2b410 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67  if( p->pPage->pg
2b420 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20  no!=p->pgnoRoot 
2b430 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52  ){.      moveToR
2b440 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  oot(p);.    }.  
2b450 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2b460 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
2b470 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
2b480 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
2b490 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
2b4a0 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
2b4b0 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a  IZE(pBt) bytes..
2b4c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2b4d0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
2b4e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
2b4f0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
2b500 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
2b510 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
2b520 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 4d 58  qlite3_malloc(MX
2b530 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 29  _CELL_SIZE(pBt))
2b540 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
2b550 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
2b560 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
2b570 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
2b580 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
2b590 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
2b5a0 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
2b5b0 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
2b5c0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
2b5d0 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
2b5e0 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
2b5f0 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
2b600 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
2b610 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
2b620 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
2b630 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
2b640 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
2b650 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
2b660 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
2b670 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
2b680 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
2b690 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
2b6a0 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
2b6b0 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
2b6c0 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
2b6d0 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
2b6e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2b6f0 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
2b700 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2b710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b720 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
2b730 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
2b740 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2b750 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2b760 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2b770 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
2b780 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
2b790 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2b7a0 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
2b7b0 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
2b7c0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2b7d0 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b7f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
2b800 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
2b810 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
2b820 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20   int appendBias 
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b840 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2b850 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
2b860 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
2b870 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
2b880 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65   int szNew;.  Me
2b890 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2b8a0 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
2b8b0 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
2b8c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2b8d0 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2b8e0 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
2b8f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
2b900 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  wCell = 0;..  as
2b910 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2b920 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2b930 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2b940 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2b950 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2b960 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2b970 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2b980 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20  doing an insert 
2b990 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2b9a0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2b9b0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2b9c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2b9d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2b9e0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2b9f0 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
2ba00 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2ba10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ba20 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43  ITE_PERM;   /* C
2ba30 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66  ursor not open f
2ba40 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2ba50 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2ba60 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2ba70 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2ba80 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20  oot, pCur) ){.  
2ba90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2baa0 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
2bab0 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
2bac0 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
2bad0 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ock */.  }.  if(
2bae0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2baf0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
2bb00 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
2bb10 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  skip;.  }..  /* 
2bb20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
2bb30 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
2bb40 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2bb50 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
2bb60 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
2bb70 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
2bb80 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21   .    SQLITE_OK!
2bb90 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
2bba0 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
2bbb0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2bbc0 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f  ) ||.    SQLITE_
2bbd0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
2bbe0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75  3BtreeMoveto(pCu
2bbf0 72 2c 20 70 4b 65 79 2c 20 30 2c 20 6e 4b 65 79  r, pKey, 0, nKey
2bc00 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c  , appendBias, &l
2bc10 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  oc)).  ){.    re
2bc20 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2bc30 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2bc40 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
2bc50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  Page->intKey || 
2bc60 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
2bc70 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2bc80 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   || !pPage->leaf
2bc90 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28  Data );.  TRACE(
2bca0 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
2bcb0 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
2bcc0 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
2bcd0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
2bce0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
2bcf0 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
2bd00 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
2bd10 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
2bd20 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
2bd30 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
2bd40 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2bd50 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
2bd60 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
2bd70 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
2bd80 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
2bd90 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
2bda0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2bdb0 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
2bdc0 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
2bdd0 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
2bde0 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
2bdf0 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
2be00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2be10 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
2be20 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
2be30 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
2be40 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
2be50 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
2be60 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
2be70 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20    if( loc==0 && 
2be80 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
2be90 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2bea0 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20    u16 szOld;.   
2beb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2bec0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
2bed0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2bee0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2bef0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2bf00 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2bf10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2bf20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
2bf30 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c  rt;.    }.    ol
2bf40 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
2bf50 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2bf60 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
2bf70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2bf80 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
2bf90 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
2bfa0 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
2bfb0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2bfc0 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2bfd0 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2bfe0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2bff0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2c000 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2c010 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2c020 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73  ge, pCur->idx, s
2c030 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zOld);.  }else i
2c040 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
2c050 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
2c060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2c070 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75  >leaf );.    pCu
2c080 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43  r->idx++;.    pC
2c090 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2c0a0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
2c0b0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
2c0c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2c0d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2c0e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
2c0f0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2c100 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ur->idx, newCell
2c110 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
2c120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c130 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69  _OK ) goto end_i
2c140 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61  nsert;.  rc = ba
2c150 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b  lance(pPage, 1);
2c160 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72  .  /* sqlite3Btr
2c170 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d  eePageDump(pCur-
2c180 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
2c190 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f  Root, 1); */.  /
2c1a0 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  * fflush(stdout)
2c1b0 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  ; */.  if( rc==S
2c1c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c1d0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2c1e0 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74  ;.  }.end_insert
2c1f0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
2c200 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2c210 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
2c220 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
2c230 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
2c240 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
2c250 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
2c260 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
2c270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2c280 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f  eeDelete(BtCurso
2c290 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2c2a0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2c2b0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69  r->pPage;.  unsi
2c2c0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2c2d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  ;.  int rc;.  Pg
2c2e0 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
2c2f0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
2c300 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
2c310 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2c320 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2c330 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2c340 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2c350 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2c360 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74  nit );.  if( pBt
2c370 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2c380 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2c390 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2c3a0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2c3b0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64  before doing a d
2c3c0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20  elete */.    rc 
2c3d0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2c3e0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2c3f0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2c400 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2c410 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2c420 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2c430 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2c440 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2c450 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2c460 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2c470 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20    if( pCur->idx 
2c480 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  >= pPage->nCell 
2c490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c4a0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
2c4b0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  The cursor is no
2c4c0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  t pointing to an
2c4d0 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
2c4e0 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2c4f0 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
2c500 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
2c510 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74  * Did not open t
2c520 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77  his cursor for w
2c530 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
2c540 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
2c550 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c  ks(pCur->pBtree,
2c560 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2c570 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65   pCur) ){.    re
2c580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2c590 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
2c5a0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
2c5b0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
2c5c0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  */.  }..  /* Res
2c5d0 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
2c5e0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2c5f0 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
2c600 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
2c610 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
2c620 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2c630 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
2c640 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2c650 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
2c660 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
2c670 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
2c680 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2c690 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
2c6a0 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
2c6b0 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
2c6c0 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
2c6d0 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
2c6e0 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43  (rc = restoreOrC
2c6f0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2c700 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  on(pCur))!=0 ||.
2c710 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c      (rc = saveAl
2c720 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2c730 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2c740 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2c750 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c760 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2c770 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a  bPage))!=0.  ){.
2c780 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c790 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
2c7a0 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
2c7b0 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61  its page and lea
2c7c0 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e  ve pCell pointin
2c7d0 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  g to the.  ** da
2c7e0 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c  ta. The clearCel
2c7f0 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61  l() call frees a
2c800 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
2c810 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2c820 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  h the.  ** cell.
2c830 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66   The cell itself
2c840 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74   is still intact
2c850 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d  ..  */.  pCell =
2c860 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2c870 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69   pCur->idx);.  i
2c880 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2c890 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  ){.    pgnoChild
2c8a0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
2c8b0 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  l);.  }.  rc = c
2c8c0 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2c8d0 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63  pCell);.  if( rc
2c8e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2c8f0 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  c;.  }..  if( !p
2c900 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2c910 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
2c920 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f  entry we are abo
2c930 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20  ut to delete is 
2c940 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66  not a leaf so if
2c950 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   we do not.    *
2c960 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  * do something w
2c970 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68  e will leave a h
2c980 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e  ole on an intern
2c990 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20  al page..    ** 
2c9a0 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20  We have to fill 
2c9b0 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69  the hole by movi
2c9c0 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f  ng in a cell fro
2c9d0 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20  m a leaf.  The. 
2c9e0 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20     ** next Cell 
2c9f0 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f  after the one to
2ca00 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67   be deleted is g
2ca10 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
2ca20 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f  st and.    ** to
2ca30 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65   be a leaf so we
2ca40 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20   can use it..   
2ca50 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72   */.    BtCursor
2ca60 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e   leafCur;.    un
2ca70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65  signed char *pNe
2ca80 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55  xt;.    int notU
2ca90 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  sed;.    unsigne
2caa0 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c  d char *tempCell
2cab0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2cac0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  ( !pPage->leafDa
2cad0 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ta );.    sqlite
2cae0 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
2caf0 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43  sor(pCur, &leafC
2cb00 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ur);.    rc = sq
2cb10 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26  lite3BtreeNext(&
2cb20 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65  leafCur, &notUse
2cb30 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2cb40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cb50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2cb60 61 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75  agerWrite(leafCu
2cb70 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r.pPage->pDbPage
2cb80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2cb90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cba0 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65  {.      u16 szNe
2cbb0 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  xt;.      TRACE(
2cbc0 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
2cbd0 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e  %d delete intern
2cbe0 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61  al from %d repla
2cbf0 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  ce from leaf %d\
2cc00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75  n",.         pCu
2cc10 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
2cc20 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75  ge->pgno, leafCu
2cc30 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  r.pPage->pgno));
2cc40 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
2cc50 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2cc60 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
2cc70 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
2cc80 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64      pNext = find
2cc90 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61  Cell(leafCur.pPa
2cca0 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29  ge, leafCur.idx)
2ccb0 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d  ;.      szNext =
2ccc0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61   cellSizePtr(lea
2ccd0 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78  fCur.pPage, pNex
2cce0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
2ccf0 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
2cd00 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b  Bt)>=szNext+4 );
2cd10 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  .      allocateT
2cd20 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
2cd30 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20       tempCell = 
2cd40 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
2cd50 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65        if( tempCe
2cd60 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
2cd70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2cd80 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2cd90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cda0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2cdb0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2cdc0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2cdd0 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74   pNext-4, szNext
2cde0 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29  +4, tempCell, 0)
2cdf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ce00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ce10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
2ce20 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2ce30 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  owCell(pPage, pC
2ce40 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68  ur->idx), pgnoCh
2ce50 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ild);.        rc
2ce60 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2ce70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2ce80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ce90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cea0 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75   dropCell(leafCu
2ceb0 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2cec0 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20  .idx, szNext);. 
2ced0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
2cee0 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67  nce(leafCur.pPag
2cef0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
2cf00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2cf10 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70  BtreeReleaseTemp
2cf20 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29  Cursor(&leafCur)
2cf30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
2cf40 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2cf50 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66  able=%d delete f
2cf60 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
2cf70 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
2cf80 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67  oRoot, pPage->pg
2cf90 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65  no));.    dropCe
2cfa0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2cfb0 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72  idx, cellSizePtr
2cfc0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b  (pPage, pCell));
2cfd0 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
2cfe0 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d  e(pPage, 0);.  }
2cff0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2d000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2d010 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2d020 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2d030 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2d040 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65   new BTree table
2d050 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
2d060 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a  iTable the page.
2d070 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
2d080 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
2d090 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a  he new table..**
2d0a0 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20  .** The type of 
2d0b0 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e  type is determin
2d0c0 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20  ed by the flags 
2d0d0 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79  parameter.  Only
2d0e0 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
2d0f0 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67  g values of flag
2d100 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
2d110 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76  in use.  Other v
2d120 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61  alues for.** fla
2d130 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72  gs might not wor
2d140 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52  k:.**.**     BTR
2d150 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f  EE_INTKEY|BTREE_
2d160 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65  LEAFDATA     Use
2d170 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73  d for SQL tables
2d180 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73   with rowid keys
2d190 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45  .**     BTREE_ZE
2d1a0 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20  RODATA          
2d1b0 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72          Used for
2d1c0 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a   SQL indices.*/.
2d1d0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2d1e0 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
2d1f0 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
2d200 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
2d210 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2d220 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
2d230 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67  age *pRoot;.  Pg
2d240 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69  no pgnoRoot;.  i
2d250 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2d260 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2d270 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2d280 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2d290 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2d2a0 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2d2b0 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2d2c0 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f  saction first */
2d2d0 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2d2e0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2d2f0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2d300 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2d310 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2d320 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2d330 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66  dOnly );..#ifdef
2d340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d350 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61  OVACUUM.  rc = a
2d360 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2d370 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2d380 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2d390 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d3a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
2d3b0 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e  else.  if( pBt->
2d3c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2d3d0 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b    Pgno pgnoMove;
2d3e0 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20        /* Move a 
2d3f0 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b  page here to mak
2d400 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72  e room for the r
2d410 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20  oot-page */.    
2d420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f  MemPage *pPageMo
2d430 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ve; /* The page 
2d440 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a  to move to. */..
2d450 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20      /* Creating 
2d460 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20  a new table may 
2d470 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65  probably require
2d480 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74   moving an exist
2d490 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20  ing database.   
2d4a0 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d   ** to make room
2d4b0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
2d4c0 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49  les root page. I
2d4d0 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65  n case this page
2d4e0 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75   turns.    ** ou
2d4f0 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66  t to be an overf
2d500 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65  low page, delete
2d510 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61   all overflow pa
2d520 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20  ge-map caches.  
2d530 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65    ** held by ope
2d540 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a  n cursors..    *
2d550 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  /.    invalidate
2d560 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
2d570 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  (pBt);..    /* R
2d580 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
2d590 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68   meta[3] from th
2d5a0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65  e database to de
2d5b0 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68  termine where th
2d5c0 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
2d5d0 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
2d5e0 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d  ble should go. m
2d5f0 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61  eta[3] is the la
2d600 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2d610 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73      ** created s
2d620 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65  o far, so the ne
2d630 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28  w root-page is (
2d640 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20  meta[3]+1)..    
2d650 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2d660 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2d670 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29  p, 4, &pgnoRoot)
2d680 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2d690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d6b0 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b  }.    pgnoRoot++
2d6c0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
2d6d0 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20  w root-page may 
2d6e0 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
2d6f0 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   on a pointer-ma
2d700 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20  p page, or the. 
2d710 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
2d720 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  TE page..    */.
2d730 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52      while( pgnoR
2d740 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  oot==PTRMAP_PAGE
2d750 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  NO(pBt, pgnoRoot
2d760 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e  ) ||.        pgn
2d770 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  oRoot==PENDING_B
2d780 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2d790 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b  .      pgnoRoot+
2d7a0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  +;.    }.    ass
2d7b0 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33  ert( pgnoRoot>=3
2d7c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f   );..    /* Allo
2d7d0 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65  cate a page. The
2d7e0 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65   page that curre
2d7f0 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20  ntly resides at 
2d800 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20  pgnoRoot will.  
2d810 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f    ** be moved to
2d820 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2d830 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20  age (unless the 
2d840 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2d850 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f  appens.    ** to
2d860 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52   reside at pgnoR
2d870 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oot)..    */.   
2d880 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2d890 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50  reePage(pBt, &pP
2d8a0 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f  ageMove, &pgnoMo
2d8b0 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ve, pgnoRoot, 1)
2d8c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2d8d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d8e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d8f0 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d  }..    if( pgnoM
2d900 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b  ove!=pgnoRoot ){
2d910 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f  .      /* pgnoRo
2d920 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ot is the page t
2d930 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
2d940 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
2d950 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ge of.      ** t
2d960 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73  he new table (as
2d970 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  suming an error 
2d980 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20  did not occur). 
2d990 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20  But we were.    
2d9a0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
2d9b0 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75  gnoMove. If requ
2d9c0 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74  ired (i.e. if it
2d9d0 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74   was not allocat
2d9e0 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65  ed.      ** by e
2d9f0 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c  xtending the fil
2da00 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  e), the current 
2da10 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e  page at position
2da20 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20   pgnoMove.      
2da30 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f  ** is already jo
2da40 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a  urnaled..      *
2da50 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  /.      u8 eType
2da60 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74  ;.      Pgno iPt
2da70 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65  rPage;..      re
2da80 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d  leasePage(pPageM
2da90 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ove);..      /* 
2daa0 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75  Move the page cu
2dab0 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52  rrently at pgnoR
2dac0 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e  oot to pgnoMove.
2dad0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2dae0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2daf0 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
2db00 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
2db10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2db20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2db30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2db40 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
2db50 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67  trmapGet(pBt, pg
2db60 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20  noRoot, &eType, 
2db70 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
2db80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2db90 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  _OK || eType==PT
2dba0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c  RMAP_ROOTPAGE ||
2dbb0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2dbc0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2dbd0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2dbe0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2dbf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2dc00 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2dc10 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
2dc20 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  OTPAGE );.      
2dc30 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2dc40 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2dc50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2dc60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2dc70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2dc80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dc90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dca0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2dcb0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2dcc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2dcd0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  }.      rc = rel
2dce0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
2dcf0 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74  Root, eType, iPt
2dd00 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29  rPage, pgnoMove)
2dd10 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2dd20 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20  age(pRoot);..   
2dd30 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65     /* Obtain the
2dd40 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f   page at pgnoRoo
2dd50 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  t */.      if( r
2dd60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dd70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2dd80 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2dd90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2dda0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2ddb0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
2ddc0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2ddd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dde0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2ddf0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2de00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2de10 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
2de20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
2de30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2de40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2de50 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2de60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2de70 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2de80 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f  else{.      pRoo
2de90 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20  t = pPageMove;. 
2dea0 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70     } ..    /* Up
2deb0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2dec0 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61  -map and meta-da
2ded0 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ta with the new 
2dee0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
2def0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74  . */.    rc = pt
2df00 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2df10 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f  oRoot, PTRMAP_RO
2df20 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  OTPAGE, 0);.    
2df30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2df40 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2df50 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2df60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
2df70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2df80 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
2df90 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20   pgnoRoot);.    
2dfa0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2dfb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2dfc0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2dfd0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   rc;.    }..  }e
2dfe0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  lse{.    rc = al
2dff0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2e000 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2e010 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2e020 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2e030 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2e040 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  f.  assert( sqli
2e050 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e060 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
2e070 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ge) );.  zeroPag
2e080 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
2e090 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
2e0a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2e0b0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2e0c0 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69  .  *piTable = (i
2e0d0 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72  nt)pgnoRoot;.  r
2e0e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e0f0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2e100 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
2e110 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
2e120 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
2e130 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2e140 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2e150 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
2e160 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
2e170 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  = btreeCreateTab
2e180 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66  le(p, piTable, f
2e190 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
2e1a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2e1b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e1c0 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67  *.** Erase the g
2e1d0 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  iven database pa
2e1e0 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63  ge and all its c
2e1f0 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e  hildren.  Return
2e200 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20  .** the page to 
2e210 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f  the freelist..*/
2e220 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
2e230 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20  rDatabasePage(. 
2e240 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2e250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e260 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74   BTree that cont
2e270 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a  ains the table *
2e280 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
2e290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2e2a0 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61  e number to clea
2e2b0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
2e2c0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
2e2d0 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55  Parent page.  NU
2e2e0 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  LL for the root 
2e2f0 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67  */.  int freePag
2e300 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65  eFlag      /* De
2e310 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66  allocate page if
2e320 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65   true */.){.  Me
2e330 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2e340 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
2e350 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2e360 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
2e370 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e380 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2e390 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2e3a0 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  pgno>sqlite3Page
2e3b0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
2e3c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
2e3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2e3e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
2e3f0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2e400 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
2e410 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74   &pPage, pParent
2e420 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2e430 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2e440 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
2e450 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
2e460 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
2e470 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2e480 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
2e490 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2e4a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
2e4b0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2e4c0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2e4d0 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61  ell), pPage->pPa
2e4e0 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rent, 1);.      
2e4f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2e500 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2e510 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
2e520 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2e530 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2e540 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2e550 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e560 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
2e570 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e580 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2e590 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2e5a0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2e5b0 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67  >aData[8]), pPag
2e5c0 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2e5d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2e5e0 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2e5f0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69  age_out;.  }.  i
2e600 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  f( freePageFlag 
2e610 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
2e620 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
2e630 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
2e640 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e650 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e660 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f  )==0 ){.    zero
2e670 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
2e680 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
2e690 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
2e6a0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2e6b0 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
2e6c0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
2e6d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e6e0 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
2e6f0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
2e700 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
2e710 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
2e720 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
2e730 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2e740 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2e750 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
2e760 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2e770 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
2e780 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
2e790 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
2e7a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e7b0 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2e7c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2e7d0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2e7e0 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
2e7f0 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
2e800 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
2e810 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
2e820 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
2e830 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  of the table..*/
2e840 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e850 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
2e860 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2e870 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
2e880 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2e890 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
2e8a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
2e8b0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
2e8c0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
2e8d0 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
2e8e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  ){.    rc = pBt-
2e8f0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2e900 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2e910 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
2e920 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 63 68  lse if( (rc = ch
2e930 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20  eckReadLocks(p, 
2e940 69 54 61 62 6c 65 2c 20 30 29 29 21 3d 53 51 4c  iTable, 0))!=SQL
2e950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
2e960 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a   nothing to do *
2e970 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51  /.  }else if( SQ
2e980 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2e990 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2e9a0 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29  t, iTable, 0)) )
2e9b0 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67  {.    /* nothing
2e9c0 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73   to do */.  }els
2e9d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  e{.    rc = clea
2e9e0 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42  rDatabasePage(pB
2e9f0 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
2ea00 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71   0, 0);.  }.  sq
2ea10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2ea20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2ea30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2ea40 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2ea50 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61  in a table and a
2ea60 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  dd the root of t
2ea70 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74  he table to.** t
2ea80 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78  he freelist.  Ex
2ea90 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f  cept, the root o
2eaa0 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20  f the principle 
2eab0 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f  table (the one o
2eac0 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20  n.** page 1) is 
2ead0 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 74  never added to t
2eae0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
2eaf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2eb00 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
2eb10 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
2eb20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
2eb30 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e  en.** cursors on
2eb40 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2eb50 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20  * If AUTOVACUUM 
2eb60 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74  is enabled and t
2eb70 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c  he page at iTabl
2eb80 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  e is not the las
2eb90 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69  t.** root page i
2eba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2ebb0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  ile, then the la
2ebc0 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a  st root page .**
2ebd0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ebe0 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69   file is moved i
2ebf0 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72  nto the slot for
2ec00 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
2ec10 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20  y.** iTable and 
2ec20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66  that last slot f
2ec30 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
2ec40 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   by the last roo
2ec50 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64  t page.** is add
2ec60 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
2ec70 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54  st instead of iT
2ec80 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73  able.  In this s
2ec90 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20  ay, all.** root 
2eca0 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20 61  pages are kept a
2ecb0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2ecc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ecd0 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69  file, which.** i
2ece0 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
2ecf0 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f  AUTOVACUUM to wo
2ed00 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f  rk right.  *piMo
2ed10 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  ved is set to th
2ed20 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  e .** page numbe
2ed30 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 62  r that used to b
2ed40 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  e the last root 
2ed50 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
2ed60 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d   before.** the m
2ed70 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65  ove.  If no page
2ed80 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69   gets moved, *pi
2ed90 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
2eda0 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72  0..** The last r
2edb0 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63 6f  oot page is reco
2edc0 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20  rded in meta[3] 
2edd0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
2ede0 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75  .** meta[3] is u
2edf0 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20 70  pdated by this p
2ee00 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61  rocedure..*/.sta
2ee10 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f  tic int btreeDro
2ee20 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  pTable(Btree *p,
2ee30 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
2ee40 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e   *piMoved){.  in
2ee50 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2ee60 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74  *pPage = 0;.  Bt
2ee70 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2ee80 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
2ee90 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2eea0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2eeb0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2eec0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2eed0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2eee0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2eef0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2ef00 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
2ef10 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
2ef20 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  l to drop a tabl
2ef30 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
2ef40 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
2ef50 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
2ef60 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
2ef70 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
2ef80 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20  ode the backend 
2ef90 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f  may.  ** need to
2efa0 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f   move another ro
2efb0 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20  ot-page to fill 
2efc0 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  a gap left by th
2efd0 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72  e deleted.  ** r
2efe0 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20  oot page. If an 
2eff0 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20  open cursor was 
2f000 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  using this page 
2f010 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20  a problem would 
2f020 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a  .  ** occur..  *
2f030 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75  /.  if( pBt->pCu
2f040 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
2f050 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2f060 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
2f070 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2f080 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
2f090 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  ble, &pPage, 0);
2f0a0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2f0b0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
2f0c0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
2f0d0 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b  able(p, iTable);
2f0e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2f0f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2f100 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
2f110 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f  rc;.  }..  *piMo
2f120 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ved = 0;..  if( 
2f130 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64  iTable>1 ){.#ifd
2f140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f150 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63  UTOVACUUM.    rc
2f160 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
2f170 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
2f180 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73  age(pPage);.#els
2f190 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  e.    if( pBt->a
2f1a0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2f1b0 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50     Pgno maxRootP
2f1c0 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  gno;.      rc = 
2f1d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
2f1e0 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f  eta(p, 4, &maxRo
2f1f0 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  otPgno);.      i
2f200 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f210 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2f220 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2f230 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f240 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
2f250 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61    if( iTable==ma
2f260 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20  xRootPgno ){.   
2f270 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
2f280 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
2f290 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  ed is the table 
2f2a0 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
2f2b0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
2f2c0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
2f2d0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75  the database, pu
2f2e0 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
2f2f0 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  on the free list
2f300 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
2f310 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
2f320 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2f330 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f340 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2f350 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f360 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2f370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f380 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2f390 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2f3a0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
2f3b0 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ped does not hav
2f3c0 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
2f3d0 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
2f3e0 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ** number in the
2f3f0 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f   database. So mo
2f400 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  ve the page that
2f410 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a   does into the .
2f420 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c          ** gap l
2f430 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74  eft by the delet
2f440 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20  ed root-page..  
2f450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f460 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b   MemPage *pMove;
2f470 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2f480 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2f490 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f4a0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
2f4b0 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
2f4c0 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
2f4d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f4e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f4f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f510 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2f520 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54  e(pBt, pMove, PT
2f530 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
2f540 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , iTable);.     
2f550 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f560 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
2f570 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2f590 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2f5a0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2f5b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2f5c0 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
2f5d0 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
2f5e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f5f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f600 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2f610 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2f620 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
2f630 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
2f640 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f650 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
2f660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f670 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2f680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f690 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d    }.        *piM
2f6a0 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67  oved = maxRootPg
2f6b0 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
2f6c0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65     /* Set the ne
2f6d0 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65  w 'max-root-page
2f6e0 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64  ' value in the d
2f6f0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20  atabase header. 
2f700 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
2f710 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c   the old value l
2f720 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e  ess one, less on
2f730 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68  e more if that h
2f740 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20  appens to.      
2f750 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67  ** be a root-pag
2f760 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f  e number, less o
2f770 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74  ne again if that
2f780 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
2f790 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
2f7a0 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  GE..      */.   
2f7b0 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2f7c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  ;.      if( maxR
2f7d0 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47  ootPgno==PENDING
2f7e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2f7f0 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
2f800 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
2f810 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  }.      if( maxR
2f820 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f  ootPgno==PTRMAP_
2f830 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52  PAGENO(pBt, maxR
2f840 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20  ootPgno) ){.    
2f850 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
2f860 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
2f870 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74   assert( maxRoot
2f880 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2f890 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2f8a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f8b0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
2f8c0 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74  ta(p, 4, maxRoot
2f8d0 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Pgno);.    }else
2f8e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
2f8f0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2f900 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f910 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  pPage);.    }.#e
2f920 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
2f930 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42    /* If sqlite3B
2f940 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61  treeDropTable wa
2f950 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  s called on page
2f960 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50   1. */.    zeroP
2f970 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49  age(pPage, PTF_I
2f980 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29  NTKEY|PTF_LEAF )
2f990 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2f9a0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
2f9b0 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69  return rc;  .}.i
2f9c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
2f9d0 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
2f9e0 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
2f9f0 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
2fa00 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
2fa10 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
2fa20 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
2fa30 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
2fa40 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69  eeDropTable(p, i
2fa50 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b  Table, piMoved);
2fa60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
2fa70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
2fa80 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2fa90 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
2faa0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
2fab0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2fac0 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
2fad0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
2fae0 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
2faf0 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
2fb00 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
2fb10 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
2fb20 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
2fb30 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
2fb40 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
2fb50 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
2fb60 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
2fb70 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
2fb80 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
2fb90 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
2fba0 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
2fbb0 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
2fbc0 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
2fbd0 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
2fbe0 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
2fbf0 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
2fc00 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
2fc10 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
2fc20 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
2fc30 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
2fc40 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
2fc50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2fc60 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
2fc70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
2fc80 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
2fc90 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74   *pDbPage;.  int
2fca0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2fcb0 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
2fcc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2fcd0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
2fce0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
2fcf0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
2fd00 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61  ..  /* Reading a
2fd10 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
2fd20 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64   requires a read
2fd30 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20  -lock on page 1 
2fd40 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20  (and hence.  ** 
2fd50 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2fd60 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62  r table. We grab
2fd70 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72   this lock regar
2fd80 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2fd90 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65   or.  ** not the
2fda0 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2fdb0 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
2fdc0 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72  set (the table r
2fdd0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20  ooted at page.  
2fde0 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20  ** 1 is treated 
2fdf0 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
2fe00 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c  e by queryTableL
2fe10 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61  ock() and lockTa
2fe20 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ble())..  */.  r
2fe30 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
2fe40 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  ck(p, 1, READ_LO
2fe50 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
2fe60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fe70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2fe80 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
2fe90 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
2fea0 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
2feb0 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d 20  x<=15 );.  rc = 
2fec0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2fed0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20  pBt->pPager, 1, 
2fee0 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
2fef0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
2ff00 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2ff10 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2ff20 20 20 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e 73    }.  pP1 = (uns
2ff30 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
2ff40 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
2ff50 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d  (pDbPage);.  *pM
2ff60 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26  eta = get4byte(&
2ff70 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29  pP1[36 + idx*4])
2ff80 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
2ff90 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
2ffa0 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63  .  /* If autovac
2ffb0 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65  uumed is disable
2ffc0 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20  d in this build 
2ffd0 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  but we are tryin
2ffe0 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73  g to .  ** acces
2fff0 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65  s an autovacuume
30000 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  d database, then
30010 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61   make the databa
30020 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20  se readonly. .  
30030 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
30040 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30050 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26  .  if( idx==4 &&
30060 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d   *pMeta>0 ) pBt-
30070 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23  >readOnly = 1;.#
30080 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62  endif..  /* Grab
30090 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f   the read-lock o
300a0 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72  n page 1. */.  r
300b0 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
300c0 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
300d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
300e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
300f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
30100 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  ite meta-informa
30110 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tion back into t
30120 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
30130 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64  ta[0] is.** read
30140 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f  -only and may no
30150 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  t be written..*/
30160 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
30170 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65  eUpdateMeta(Btre
30180 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
30190 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53  32 iMeta){.  BtS
301a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
301b0 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
301c0 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74  char *pP1;.  int
301d0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
301e0 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35  dx>=1 && idx<=15
301f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
30200 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
30210 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
30220 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
30230 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
30240 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
30250 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
30260 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
30270 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
30280 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
30290 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a  t->pPage1!=0 );.
302a0 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70      pP1 = pBt->p
302b0 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
302c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
302d0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
302e0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
302f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
30310 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  ut4byte(&pP1[36 
30320 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29  + idx*4], iMeta)
30330 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
30340 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30350 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d  .      if( idx==
30360 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  7 ){.        ass
30370 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
30380 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30  cuum || iMeta==0
30390 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
303a0 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20  rt( iMeta==0 || 
303b0 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20  iMeta==1 );.    
303c0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
303d0 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20  uum = iMeta;.   
303e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
303f0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
30400 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
30410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30420 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
30430 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20  lag byte at the 
30440 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
30450 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63   page that the c
30460 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
30470 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
30480 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
30490 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75  3BtreeFlags(BtCu
304a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
304b0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f  * TODO: What abo
304c0 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  ut CURSOR_REQUIR
304d0 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f  ESEEK state? Pro
304e0 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61  bably need to ca
304f0 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f  ll.  ** restoreO
30500 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
30510 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a  tion() here..  *
30520 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
30530 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72 43  ge;.  restoreOrC
30540 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
30550 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67  on(pCur);.  pPag
30560 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
30570 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
30580 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
30590 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
305a0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d  Page->pBt==pCur-
305b0 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e  >pBt );.  return
305c0 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e   pPage ? pPage->
305d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
305e0 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a  Offset] : 0;.}..
305f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
30600 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61 74  e pager associat
30610 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65 2e  ed with a BTree.
30620 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
30630 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
30640 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
30650 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67  ing only..*/.Pag
30660 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  er *sqlite3Btree
30670 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b  Pager(Btree *p){
30680 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
30690 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66  ->pPager;.}..#if
306a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
306b0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
306c0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
306d0 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 65  message to the e
306e0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
306f0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
30700 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d  oid checkAppendM
30710 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  sg(.  IntegrityC
30720 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61  k *pCheck,.  cha
30730 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73  r *zMsg1,.  cons
30740 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
30750 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c  .  ....){.  va_l
30760 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
30770 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21 70 43  zMsg2;.  if( !pC
30780 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65  heck->mxErr ) re
30790 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  turn;.  pCheck->
307a0 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63  mxErr--;.  pChec
307b0 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f  k->nErr++;.  va_
307c0 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
307d0 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71  t);.  zMsg2 = sq
307e0 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 30 2c  lite3VMPrintf(0,
307f0 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
30800 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
30810 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d  f( zMsg1==0 ) zM
30820 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28 20  sg1 = "";.  if( 
30830 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20  pCheck->zErrMsg 
30840 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c  ){.    char *zOl
30850 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72  d = pCheck->zErr
30860 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d  Msg;.    pCheck-
30870 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
30880 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
30890 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72  ng(&pCheck->zErr
308a0 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c  Msg, zOld, "\n",
308b0 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28   zMsg1, zMsg2, (
308c0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71  char*)0);.    sq
308d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29  lite3_free(zOld)
308e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
308f0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
30900 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67  &pCheck->zErrMsg
30910 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
30920 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20  (char*)0);.  }. 
30930 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
30940 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  sg2);.}.#endif /
30950 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
30960 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
30970 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30980 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
30990 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CHECK./*.** Add 
309a0 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  1 to the referen
309b0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
309c0 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68 69  e iPage.  If thi
309d0 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  s is the second.
309e0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
309f0 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e  the page, add an
30a00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
30a10 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  o pCheck->zErrMs
30a20 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  g..** Return 1 i
30a30 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f 72  f there are 2 or
30a40 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65  e more reference
30a50 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  s to the page an
30a60 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69  d 0 if.** if thi
30a70 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  s is the first r
30a80 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
30a90 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  page..**.** Also
30aa0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
30ab0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69  page number is i
30ac0 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61  n bounds..*/.sta
30ad0 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66  tic int checkRef
30ae0 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43  (IntegrityCk *pC
30af0 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c  heck, int iPage,
30b00 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29   char *zContext)
30b10 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30  {.  if( iPage==0
30b20 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
30b30 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d  f( iPage>pCheck-
30b40 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c  >nPage || iPage<
30b50 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
30b60 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
30b70 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c  zContext, "inval
30b80 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25  id page number %
30b90 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
30ba0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
30bb0 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65  if( pCheck->anRe
30bc0 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20  f[iPage]==1 ){. 
30bd0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
30be0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
30bf0 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e  xt, "2nd referen
30c00 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20  ce to page %d", 
30c10 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
30c20 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
30c30 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52  rn  (pCheck->anR
30c40 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a  ef[iPage]++)>1;.
30c50 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
30c60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30c70 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  M./*.** Check th
30c80 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20  at the entry in 
30c90 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
30ca0 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64 20  for page iChild 
30cb0 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65  maps to .** page
30cc0 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65   iParent, pointe
30cd0 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e 20  r type ptrType. 
30ce0 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61  If not, append a
30cf0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
30d00 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f  ** to pCheck..*/
30d10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
30d20 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65  ckPtrmap(.  Inte
30d30 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
30d40 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20     /* Integrity 
30d50 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f  check context */
30d60 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
30d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69            /* Chi
30d80 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ld page number *
30d90 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
30da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
30db0 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
30dc0 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e  ap type */.  Pgn
30dd0 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20  o iParent,      
30de0 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
30df0 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65  pointer map pare
30e00 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  nt page number *
30e10 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
30e20 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  xt         /* Co
30e30 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f  ntext descriptio
30e40 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f  n (used for erro
30e50 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69  r msg) */.){.  i
30e60 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72  nt rc;.  u8 ePtr
30e70 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20  mapType;.  Pgno 
30e80 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a  iPtrmapParent;..
30e90 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
30ea0 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43  (pCheck->pBt, iC
30eb0 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79  hild, &ePtrmapTy
30ec0 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65  pe, &iPtrmapPare
30ed0 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
30ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30ef0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30f00 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30f10 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64   "Failed to read
30f20 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c   ptrmap key=%d",
30f30 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65   iChild);.    re
30f40 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
30f50 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54   ePtrmapType!=eT
30f60 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61  ype || iPtrmapPa
30f70 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b  rent!=iParent ){
30f80 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
30f90 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30fa0 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61  text, .      "Ba
30fb0 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20  d ptr map entry 
30fc0 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d  key=%d expected=
30fd0 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c  (%d,%d) got=(%d,
30fe0 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68  %d)", .      iCh
30ff0 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72  ild, eType, iPar
31000 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65  ent, ePtrmapType
31010 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29  , iPtrmapParent)
31020 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
31030 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
31040 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
31050 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20   freelist or of 
31060 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
31070 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79   list..** Verify
31080 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
31090 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
310a0 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73   list is N..*/.s
310b0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
310c0 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74  List(.  Integrit
310d0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
310e0 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
310f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
31100 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c   int isFreeList,
31110 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
31120 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20  or a freelist.  
31130 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c  False for overfl
31140 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ow page list */.
31150 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
31160 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31170 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74  number for first
31180 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
31190 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
311a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
311b0 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  Expected number 
311c0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
311d0 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
311e0 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
311f0 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65  /* Context for e
31200 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
31210 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
31220 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b  nt expected = N;
31230 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
31240 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20  iPage;.  while( 
31250 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63  N-- > 0 && pChec
31260 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20  k->mxErr ){.    
31270 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67  DbPage *pOvflPag
31280 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e;.    unsigned 
31290 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b  char *pOvflData;
312a0 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 31  .    if( iPage<1
312b0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
312c0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
312d0 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
312e0 20 20 20 20 22 25 64 20 6f 66 20 25 64 20 70 61      "%d of %d pa
312f0 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  ges missing from
31300 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73   overflow list s
31310 74 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a  tarting at %d",.
31320 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65            N+1, e
31330 78 70 65 63 74 65 64 2c 20 69 46 69 72 73 74 29  xpected, iFirst)
31340 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31350 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
31360 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
31370 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29  age, zContext) )
31380 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
31390 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
313a0 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20  pCheck->pPager, 
313b0 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f  (Pgno)iPage, &pO
313c0 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20  vflPage) ){.    
313d0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
313e0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
313f0 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65  t, "failed to ge
31400 74 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  t page %d", iPag
31410 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
31420 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c  .    }.    pOvfl
31430 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  Data = (unsigned
31440 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
31450 61 67 65 72 47 65 74 44 61 74 61 28 70 4f 76 66  agerGetData(pOvf
31460 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  lPage);.    if( 
31470 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20  isFreeList ){.  
31480 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34      int n = get4
31490 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b  byte(&pOvflData[
314a0 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
314b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
314c0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43  UUM.      if( pC
314d0 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
314e0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
314f0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
31500 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  eck, iPage, PTRM
31510 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
31520 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31530 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31540 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42  if( n>pCheck->pB
31550 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  t->usableSize/4-
31560 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  8 ){.        che
31570 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31580 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
31590 20 20 20 20 20 20 20 20 20 22 66 72 65 65 6c 69           "freeli
315a0 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f  st leaf count to
315b0 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64  o big on page %d
315c0 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ", iPage);.     
315d0 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65     N--;.      }e
315e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
315f0 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
31600 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
31610 69 46 72 65 65 50 61 67 65 20 3d 20 67 65 74 34  iFreePage = get4
31620 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b  byte(&pOvflData[
31630 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66  8+i*4]);.#ifndef
31640 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31650 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
31660 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
31670 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31680 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65  .            che
31690 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
316a0 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d   iFreePage, PTRM
316b0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
316c0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
316d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
316e0 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65 66          checkRef
316f0 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
31700 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
31710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31720 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   N -= n;.      }
31730 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
31740 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31750 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a  ACUUM.    else{.
31760 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
31770 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
31780 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  ts auto-vacuum a
31790 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20  nd iPage is not 
317a0 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
317b0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f  * page in this o
317c0 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68  verflow list, ch
317d0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69  eck that the poi
317e0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
317f0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  or.      ** the 
31800 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d  following page m
31810 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20  atches iPage..  
31820 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
31830 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
31840 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20  toVacuum && N>0 
31850 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67  ){.        i = g
31860 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74  et4byte(pOvflDat
31870 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63  a);.        chec
31880 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31890 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  i, PTRMAP_OVERFL
318a0 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW2, iPage, zCon
318b0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  text);.      }. 
318c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
318d0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
318e0 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20  (pOvflData);.   
318f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
31900 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20  ef(pOvflPage);. 
31910 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
31920 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
31930 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
31940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31950 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
31960 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69  CK./*.** Do vari
31970 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ous sanity check
31980 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61  s on a single pa
31990 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52  ge of a tree.  R
319a0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65  eturn.** the tre
319b0 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70  e depth.  Root p
319c0 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20  ages return 0.  
319d0 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20  Parents of root 
319e0 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20  pages.** return 
319f0 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  1, and so forth.
31a00 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68  .** .** These ch
31a10 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a  ecks are done:.*
31a20 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61  *.**      1.  Ma
31a30 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65 6c  ke sure that cel
31a40 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b  ls and freeblock
31a50 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70  s do not overlap
31a60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75 74  .**          but
31a70 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70   combine to comp
31a80 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65  letely cover the
31a90 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32   page..**  NO  2
31aa0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c  .  Make sure cel
31ab0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72  l keys are in or
31ac0 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20  der..**  NO  3. 
31ad0 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
31ae0 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  y is less than o
31af0 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65  r equal to zLowe
31b00 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20  rBound..**  NO  
31b10 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f  4.  Make sure no
31b20 20 6b 65 79 20 69 73 20 67 72 65 61 74 65 72 20   key is greater 
31b30 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
31b40 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zUpperBound..**
31b50 20 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20        5.  Check 
31b60 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
31b70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
31b80 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63  .**      6.  Rec
31b90 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68  ursively call ch
31ba0 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61  eckTreePage on a
31bb0 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20  ll children..** 
31bc0 20 20 20 20 20 37 2e 20 20 56 65 72 69 66 79 20       7.  Verify 
31bd0 74 68 61 74 20 74 68 65 20 64 65 70 74 68 20 6f  that the depth o
31be0 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69  f all children i
31bf0 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20  s the same..**  
31c00 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72      8.  Make sur
31c10 65 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61  e this page is a
31c20 74 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c  t least 33% full
31c30 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a   or else it is.*
31c40 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72  *          the r
31c50 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
31c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
31c70 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20  heckTreePage(.  
31c80 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
31c90 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74  eck,  /* Context
31ca0 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20   for the sanity 
31cb0 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69  check */.  int i
31cc0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
31cd0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
31ce0 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 63  of the page to c
31cf0 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  heck */.  MemPag
31d00 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
31d10 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a  /* Parent page *
31d20 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  /.  char *zParen
31d30 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72  tContext  /* Par
31d40 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29  ent context */.)
31d50 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
31d60 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c  ge;.  int i, rc,
31d70 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f   depth, d2, pgno
31d80 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72  , cnt;.  int hdr
31d90 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69  , cellStart;.  i
31da0 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a  nt nCell;.  u8 *
31db0 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  data;.  BtShared
31dc0 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61   *pBt;.  int usa
31dd0 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20  bleSize;.  char 
31de0 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20  zContext[100];. 
31df0 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73   char *hit;..  s
31e00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31e10 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
31e20 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67  , zContext, "Pag
31e30 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  e %d: ", iPage);
31e40 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
31e50 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73 74  t the page exist
31e60 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70  s.  */.  pBt = p
31e70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73  Check->pBt;.  us
31e80 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
31e90 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66  usableSize;.  if
31ea0 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
31eb0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65  urn 0;.  if( che
31ec0 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
31ed0 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74  age, zParentCont
31ee0 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ext) ) return 0;
31ef0 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  .  if( (rc = sql
31f00 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
31f10 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67  (pBt, (Pgno)iPag
31f20 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
31f30 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
31f40 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31f50 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
31f60 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
31f70 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20  the page. error 
31f80 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20  code=%d", rc);. 
31f90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
31fa0 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  .  if( (rc = sql
31fb0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
31fc0 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
31fd0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
31fe0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31ff0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
32000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32010 20 20 22 73 71 6c 69 74 65 33 42 74 72 65 65 49    "sqlite3BtreeI
32020 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e  nitPage() return
32030 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22  s error code %d"
32040 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61  , rc);.    relea
32050 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
32060 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
32070 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74  ..  /* Check out
32080 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a   all the cells..
32090 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30    */.  depth = 0
320a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
320b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70  Page->nCell && p
320c0 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b  Check->mxErr; i+
320d0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
320e0 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  l;.    int sz;. 
320f0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
32100 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
32110 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77  payload overflow
32120 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20   pages.    */.  
32130 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
32140 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
32150 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  xt), zContext,. 
32160 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
32170 74 72 65 65 20 70 61 67 65 20 25 64 20 63 65 6c  tree page %d cel
32180 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20  l %d: ", iPage, 
32190 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  i);.    pCell = 
321a0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 69  findCell(pPage,i
321b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
321c0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
321d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
321e0 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69  nfo);.    sz = i
321f0 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69  nfo.nData;.    i
32200 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
32210 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e  y ) sz += info.n
32220 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Key;.    assert(
32230 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f   sz==info.nPaylo
32240 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a  ad );.    if( sz
32250 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
32260 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
32270 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  = (sz - info.nLo
32280 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65  cal + usableSize
32290 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a   - 5)/(usableSiz
322a0 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67  e - 4);.      Pg
322b0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
322c0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
322d0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
322e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
322f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
32300 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
32310 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
32320 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
32330 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c  pCheck, pgnoOvfl
32340 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
32350 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  W1, iPage, zCont
32360 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
32370 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b  ndif.      check
32380 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20  List(pCheck, 0, 
32390 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c  pgnoOvfl, nPage,
323a0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
323b0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
323c0 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63  sanity of left c
323d0 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a  hild page..    *
323e0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
323f0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
32400 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
32410 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  pCell);.#ifndef 
32420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32430 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
32440 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
32450 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
32460 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
32470 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
32480 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  EE, iPage, zCont
32490 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
324a0 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20  ndif.      d2 = 
324b0 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
324c0 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c  heck,pgno,pPage,
324d0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
324e0 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d   if( i>0 && d2!=
324f0 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20  depth ){.       
32500 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32510 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
32520 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64 65  , "Child page de
32530 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20  pth differs");. 
32540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70       }.      dep
32550 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20  th = d2;.    }. 
32560 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
32570 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
32580 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
32590 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
325a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
325b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
325c0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
325d0 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
325e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
325f0 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61 67 65          "On page
32600 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68 69   %d at right chi
32610 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23  ld: ", iPage);.#
32620 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32630 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32640 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
32650 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63  acuum ){.      c
32660 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
32670 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  k, pgno, PTRMAP_
32680 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29  BTREE, iPage, 0)
32690 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
326a0 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
326b0 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70  (pCheck, pgno, p
326c0 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
326d0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63  .  }. .  /* Chec
326e0 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63  k for complete c
326f0 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20 70  overage of the p
32700 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20  age.  */.  data 
32710 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
32720 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
32730 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20  drOffset;.  hit 
32740 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
32750 65 72 6f 28 20 75 73 61 62 6c 65 53 69 7a 65 20  ero( usableSize 
32760 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a  );.  if( hit ){.
32770 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20      memset(hit, 
32780 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  1, get2byte(&dat
32790 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20  a[hdr+5]));.    
327a0 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
327b0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
327c0 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20      cellStart = 
327d0 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
327e0 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f  ge->leaf;.    fo
327f0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
32800 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
32810 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
32820 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a  ata[cellStart+i*
32830 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20 73  2]);.      u16 s
32840 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
32850 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
32860 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  c]);.      int j
32870 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b  ;.      if( (pc+
32880 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
32890 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20  ize || pc<0 ){. 
328a0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
328b0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
328c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
328d0 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
328e0 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
328f0 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
32900 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
32910 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
32920 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70  =pc+size-1; j>=p
32930 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  c; j--) hit[j]++
32940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32950 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69      for(cnt=0, i
32960 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
32970 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20  hdr+1]); i>0 && 
32980 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  i<usableSize && 
32990 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20  cnt<10000; .    
329a0 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20         cnt++){. 
329b0 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
329c0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
329d0 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  +2]);.      int 
329e0 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b  j;.      if( (i+
329f0 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
32a00 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20  ize || i<0 ){.  
32a10 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
32a20 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
32a30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
32a40 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
32a50 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
32a60 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
32a70 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
32a80 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
32a90 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b  =i+size-1; j>=i;
32aa0 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a   j--) hit[j]++;.
32ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
32ac0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
32ad0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
32ae0 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75  for(i=cnt=0; i<u
32af0 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b  sableSize; i++){
32b00 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69  .      if( hit[i
32b10 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
32b20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
32b30 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20  se if( hit[i]>1 
32b40 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
32b50 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32b60 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22  , 0,.          "
32b70 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f  Multiple uses fo
32b80 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67  r byte %d of pag
32b90 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29  e %d", i, iPage)
32ba0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
32bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32bc0 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61     if( cnt!=data
32bd0 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20  [hdr+7] ){.     
32be0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32bf0 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
32c00 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65        "Fragmente
32c10 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79  d space is %d by
32c20 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25  te reported as %
32c30 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20  d on page %d",. 
32c40 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61           cnt, da
32c50 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65  ta[hdr+7], iPage
32c60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
32c70 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69 74 29  qlite3_free(hit)
32c80 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
32c90 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
32ca0 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e  n depth+1;.}.#en
32cb0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
32cc0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
32cd0 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
32ce0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
32cf0 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
32d00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
32d10 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68  es a complete ch
32d20 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eck of the given
32d30 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52   BTree file.  aR
32d40 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61  oot[] is.** an a
32d50 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75  rray of pages nu
32d60 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20  mbers were each 
32d70 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74  page number is t
32d80 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a  he root page of.
32d90 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f  ** a table.  nRo
32da0 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ot is the number
32db0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
32dc0 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Root..**.** If e
32dd0 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73  verything checks
32de0 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69   out, this routi
32df0 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
32e00 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69    If something i
32e10 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65  s.** amiss, an e
32e20 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
32e30 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
32e40 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
32e50 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e  m malloc().** an
32e60 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
32e70 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67  hat error messag
32e80 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
32e90 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
32ea0 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
32eb0 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
32ec0 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
32ed0 73 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  sage when it is 
32ee0 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  done..*/.char *s
32ef0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
32f00 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72  rityCheck(.  Btr
32f10 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68  ee *p,     /* Th
32f20 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 63 68  e btree to be ch
32f30 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  ecked */.  int *
32f40 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61  aRoot,   /* An a
32f50 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67  rray of root pag
32f60 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69  es numbers for i
32f70 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65 73 20  ndividual trees 
32f80 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20  */.  int nRoot, 
32f90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32fa0 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74  entries in aRoot
32fb0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72  [] */.  int mxEr
32fc0 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65  r,    /* Stop re
32fd0 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61  porting errors a
32fe0 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a  fter this many *
32ff0 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20  /.  int *pnErr  
33000 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65    /* Write numbe
33010 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
33020 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c   to this variabl
33030 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
33040 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49  .  int nRef;.  I
33050 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68 65 63  ntegrityCk sChec
33060 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  k;.  BtShared *p
33070 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
33080 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
33090 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
330a0 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52 65 66 20  = p->db;.  nRef 
330b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
330c0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
330d0 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
330e0 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
330f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33100 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
33110 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
33120 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 44 75  urn sqlite3StrDu
33130 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71  p("Unable to acq
33140 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
33150 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33160 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
33170 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
33180 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
33190 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
331a0 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69  eck.nPage = sqli
331b0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
331c0 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
331d0 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
331e0 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
331f0 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a  ck.nErr = 0;.  *
33200 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64  pnErr = 0;.#ifnd
33210 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33220 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
33230 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29  pBt->nTrunc!=0 )
33240 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61  {.    sCheck.nPa
33250 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ge = pBt->nTrunc
33260 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
33270 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d  f( sCheck.nPage=
33280 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  =0 ){.    unlock
33290 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
332a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  t);.    sqlite3B
332b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
332c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
332d0 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d    sCheck.anRef =
332e0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
332f0 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
33300 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
33310 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69  anRef[0]) );.  i
33320 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66  f( !sCheck.anRef
33330 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
33340 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
33350 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31  ;.    *pnErr = 1
33360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
33370 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
33380 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50  return sqlite3MP
33390 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 22 55 6e  rintf(p->db, "Un
333a0 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25  able to malloc %
333b0 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20  d bytes", .     
333c0 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65     (sCheck.nPage
333d0 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
333e0 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20  k.anRef[0]));.  
333f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  }.  for(i=0; i<=
33400 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b  sCheck.nPage; i+
33410 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  +){ sCheck.anRef
33420 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d  [i] = 0; }.  i =
33430 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
33440 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69  GE(pBt);.  if( i
33450 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29  <=sCheck.nPage )
33460 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52  {.    sCheck.anR
33470 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20  ef[i] = 1;.  }. 
33480 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20   sCheck.zErrMsg 
33490 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
334a0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
334b0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  f the freelist. 
334c0 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28   */.  checkList(
334d0 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34  &sCheck, 1, get4
334e0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
334f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20  1->aData[32]),. 
33500 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
33510 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
33520 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d  ->aData[36]), "M
33530 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29  ain freelist: ")
33540 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c  ;..  /* Check al
33550 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20  l the tables..  
33560 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
33570 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e  nRoot && sCheck.
33580 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
33590 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30   if( aRoot[i]==0
335a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
335b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
335c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
335d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
335e0 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e  uum && aRoot[i]>
335f0 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
33600 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20  Ptrmap(&sCheck, 
33610 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50  aRoot[i], PTRMAP
33620 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29  _ROOTPAGE, 0, 0)
33630 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
33640 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
33650 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
33660 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20  i], 0, "List of 
33670 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a  tree roots: ");.
33680 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
33690 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ure every page i
336a0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  n the file is re
336b0 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20  ferenced.  */.  
336c0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65  for(i=1; i<=sChe
336d0 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65  ck.nPage && sChe
336e0 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
336f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
33700 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
33710 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
33720 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ef[i]==0 ){.    
33730 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
33740 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
33750 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
33760 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
33770 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20  #else.    /* If 
33780 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
33790 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
337a0 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20  m, make sure no 
337b0 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20  tables contain. 
337c0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
337d0 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   to pointer-map 
337e0 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  pages..    */.  
337f0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
33800 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20  ef[i]==0 && .   
33810 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
33820 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c  NO(pBt, i)!=i ||
33830 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
33840 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
33850 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
33860 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
33870 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
33880 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
33890 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
338a0 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]!=0 && .       
338b0 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
338c0 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74  Bt, i)==i && pBt
338d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
338e0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
338f0 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
33900 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  , "Pointer map p
33910 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65  age %d is refere
33920 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  nced", i);.    }
33930 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
33940 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  * Make sure this
33950 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f   analysis did no
33960 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65  t leave any unre
33970 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20  f() pages.  */. 
33980 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
33990 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28  used(pBt);.  if(
339a0 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33   nRef != sqlite3
339b0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
339c0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
339d0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
339e0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  (&sCheck, 0, .  
339f0 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67      "Outstanding
33a00 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73   page count goes
33a10 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64   from %d to %d d
33a20 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79  uring this analy
33a30 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66  sis",.      nRef
33a40 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  , sqlite3PagerRe
33a50 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
33a60 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  er).    );.  }..
33a70 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
33a80 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
33a90 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
33aa0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
33ab0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
33ac0 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a  heck.anRef);.  *
33ad0 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e  pnErr = sCheck.n
33ae0 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 43  Err;.  return sC
33af0 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a  heck.zErrMsg;.}.
33b00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
33b10 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
33b20 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CHECK */../*.** 
33b30 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
33b40 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
33b50 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
33b60 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
33b70 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e 61  The pager filena
33b80 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
33b90 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
33ba0 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
33bb0 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
33bc0 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
33bd0 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
33be0 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
33bf0 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
33c00 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65  etFilename(Btree
33c10 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
33c20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
33c30 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
33c40 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
33c50 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
33c60 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
33c70 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
33c80 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
33c90 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
33ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33cb0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
33cc0 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  er directory nam
33cd0 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61  e is invariant a
33ce0 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61  s long as the pa
33cf0 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73  ger is.** open s
33d00 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
33d10 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74  access without t
33d20 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
33d30 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  x..*/.const char
33d40 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
33d50 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a  tDirname(Btree *
33d60 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
33d70 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
33d80 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
33d90 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
33da0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
33db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33dc0 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
33dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
33de0 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  e for this datab
33df0 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a  ase. The return.
33e00 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
33e10 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
33e20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20  same regardless 
33e30 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a  of whether the j
33e40 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
33e50 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
33e60 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  or not..**.** Th
33e70 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20  e pager journal 
33e80 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61  filename is inva
33e90 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73  riant as long as
33ea0 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a   the pager is.**
33eb0 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73   open so it is s
33ec0 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69  afe to access wi
33ed0 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72  thout the BtShar
33ee0 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e  ed mutex..*/.con
33ef0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
33f00 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
33f10 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
33f20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
33f30 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
33f40 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
33f50 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  gerJournalname(p
33f60 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
33f70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
33f80 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
33f90 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d  .** Copy the com
33fa0 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
33fb0 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42   pBtFrom into pB
33fc0 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74  tTo.  A transact
33fd0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61  ion.** must be a
33fe0 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66  ctive for both f
33ff0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
34000 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54 6f  size of file pTo
34010 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20   may be reduced 
34020 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
34030 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  n..** If anythin
34040 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68  g goes wrong, th
34050 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e transaction on
34060 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62   pTo is rolled b
34070 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ack. .**.** If s
34080 75 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69  uccessful, Commi
34090 74 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79 20  tPhaseOne() may 
340a0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f  be called on pTo
340b0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
340c0 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  g. .** The calle
340d0 72 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68 20  r should finish 
340e0 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74  committing the t
340f0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54  ransaction on pT
34100 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  o by calling.** 
34110 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
34120 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
34130 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c  int btreeCopyFil
34140 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74  e(Btree *pTo, Bt
34150 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ree *pFrom){.  i
34160 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34170 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20  K;.  Pgno i;..  
34180 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20  Pgno nFromPage; 
34190 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
341a0 20 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d 20   pages in pFrom 
341b0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67  */.  Pgno nToPag
341c0 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  e;       /* Numb
341d0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
341e0 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65  To */.  Pgno nNe
341f0 77 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e  wPage;      /* N
34200 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
34210 6e 20 70 54 6f 20 61 66 74 65 72 20 74 68 65 20  n pTo after the 
34220 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20  copy */..  Pgno 
34230 69 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 2f  iSkip;         /
34240 2a 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20 70  * Pending byte p
34250 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20  age in pTo */.  
34260 69 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b  int nToPageSize;
34270 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
34280 20 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65 73   of pTo in bytes
34290 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50   */.  int nFromP
342a0 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67  ageSize;  /* Pag
342b0 65 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20  e size of pFrom 
342c0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42  in bytes */..  B
342d0 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d  tShared *pBtTo =
342e0 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53   pTo->pBt;.  BtS
342f0 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d  hared *pBtFrom =
34300 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70   pFrom->pBt;.  p
34310 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e  BtTo->db = pTo->
34320 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64  db;.  pBtFrom->d
34330 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a  b = pFrom->db;..
34340 20 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d 20    nToPageSize = 
34350 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b  pBtTo->pageSize;
34360 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  .  nFromPageSize
34370 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65   = pBtFrom->page
34380 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f  Size;..  if( pTo
34390 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
343a0 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d  _WRITE || pFrom-
343b0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
343c0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74  WRITE ){.    ret
343d0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
343e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54  ;.  }.  if( pBtT
343f0 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  o->pCursor ){.  
34400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34410 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f  BUSY;.  }..  nTo
34420 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
34430 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
34440 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e  To->pPager);.  n
34450 46 72 6f 6d 50 61 67 65 20 3d 20 73 71 6c 69 74  FromPage = sqlit
34460 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
34470 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
34480 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e  );.  iSkip = PEN
34490 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
344a0 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72  BtTo);..  /* Var
344b0 69 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20 69  iable nNewPage i
344c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
344d0 70 61 67 65 73 20 72 65 71 75 69 72 65 64 20 74  pages required t
344e0 6f 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a  o store the.  **
344f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72   contents of pFr
34500 6f 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  om using the cur
34510 72 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20 6f  rent page-size o
34520 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e  f pTo..  */.  nN
34530 65 77 50 61 67 65 20 3d 20 28 28 69 36 34 29 6e  ewPage = ((i64)n
34540 46 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34 29  FromPage * (i64)
34550 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20  nFromPageSize + 
34560 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65  (i64)nToPageSize
34570 20 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20 28   - 1) / .      (
34580 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b  i64)nToPageSize;
34590 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d  ..  for(i=1; rc=
345a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69  =SQLITE_OK && (i
345b0 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d  <=nToPage || i<=
345c0 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b  nNewPage); i++){
345d0 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c  ..    /* Journal
345e0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
345f0 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
34600 2a 20 69 53 6b 69 70 20 69 73 20 74 68 65 20 70  * iSkip is the p
34610 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
34620 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 28  e locking page (
34630 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
34640 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61 74  E).    ** in dat
34650 61 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66 6f  abase *pTo (befo
34660 72 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54 68  re the copy). Th
34670 69 73 20 70 61 67 65 20 69 73 20 6e 65 76 65 72  is page is never
34680 20 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a   written .    **
34690 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
346a0 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69  l file. Unless i
346b0 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20 70  ==iSkip or the p
346c0 61 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20 20  age was not.    
346d0 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70 54  ** present in pT
346e0 6f 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70  o before the cop
346f0 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75  y operation, jou
34700 72 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f 6d  rnal page i from
34710 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   pTo..    */.   
34720 20 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26 26   if( i!=iSkip &&
34730 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20   i<=nToPage ){. 
34740 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
34750 50 61 67 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Page;.      rc =
34760 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34770 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
34780 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  i, &pDbPage);.  
34790 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
347a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
347b0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
347c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
347d0 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
347e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
347f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
34800 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 6e   }.      if( i>n
34810 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  FromPage ){.    
34820 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74      /* Yeah.  It
34830 20 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20   seems wierd to 
34840 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29  call DontWrite()
34850 20 72 69 67 68 74 20 61 66 74 65 72 20 57 72 69   right after Wri
34860 74 65 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20  te(). But.      
34870 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65 63    ** that is bec
34880 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ause the names o
34890 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75 72  f those procedur
348a0 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c  es do not exactl
348b0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  y .        ** re
348c0 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65  present what the
348d0 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72  y do.  Write() r
348e0 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74  eally means "put
348f0 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68   this page in th
34900 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c  e.        ** rol
34910 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
34920 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72  d mark it as dir
34930 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ty so that it wi
34940 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ll be written.  
34950 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
34960 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61  database file la
34970 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65  ter."  DontWrite
34980 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65  () undoes the se
34990 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20  cond part of.   
349a0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 64       ** that and
349b0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
349c0 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  ge from being wr
349d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
349e0 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20 20  abase. The.     
349f0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74     ** page is st
34a00 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  ill on the rollb
34a10 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f  ack journal, tho
34a20 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69  ugh.  And that i
34a30 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  s the .        *
34a40 2a 20 77 68 6f 6c 65 20 70 6f 69 6e 74 20 6f 66  * whole point of
34a50 20 74 68 69 73 20 62 6c 6f 63 6b 3a 20 74 6f 20   this block: to 
34a60 70 75 74 20 70 61 67 65 73 20 6f 6e 20 74 68 65  put pages on the
34a70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
34a80 6c 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  l. .        */. 
34a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
34aa0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62  gerDontWrite(pDb
34ab0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
34ac0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
34ad0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
34ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
34af0 76 65 72 77 72 69 74 65 20 74 68 65 20 64 61 74  verwrite the dat
34b00 61 20 69 6e 20 70 61 67 65 20 69 20 6f 66 20 74  a in page i of t
34b10 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
34b20 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  se */.    if( rc
34b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
34b40 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e 4e  !=iSkip && i<=nN
34b50 65 77 50 61 67 65 20 29 7b 0a 0a 20 20 20 20 20  ewPage ){..     
34b60 20 44 62 50 61 67 65 20 2a 70 54 6f 50 61 67 65   DbPage *pToPage
34b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
34b80 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 3b 0a  te3_int64 iOff;.
34b90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34ba0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54  te3PagerGet(pBtT
34bb0 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  o->pPager, i, &p
34bc0 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  ToPage);.      i
34bd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34be0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34c00 74 65 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20  te(pToPage);.   
34c10 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
34c20 0a 20 20 20 20 20 20 20 20 69 4f 66 66 3d 28 69  .        iOff=(i
34c30 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b  -1)*nToPageSize;
34c40 20 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51   .        rc==SQ
34c50 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c  LITE_OK && iOff<
34c60 69 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a  i*nToPageSize; .
34c70 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
34c80 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20  nFromPageSize.  
34c90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 44      ){.        D
34ca0 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65  bPage *pFromPage
34cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 50 67   = 0;.        Pg
34cc0 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66  no iFrom = (iOff
34cd0 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b  /nFromPageSize)+
34ce0 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  1;..        if( 
34cf0 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42  iFrom==PENDING_B
34d00 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d  YTE_PAGE(pBtFrom
34d10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
34d20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
34d30 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
34d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34d50 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
34d60 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50  , iFrom, &pFromP
34d70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
34d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
34da0 72 20 2a 7a 54 6f 20 3d 20 73 71 6c 69 74 65 33  r *zTo = sqlite3
34db0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 54 6f  PagerGetData(pTo
34dc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
34dd0 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73   char *zFrom = s
34de0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
34df0 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  ta(pFromPage);. 
34e00 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f           int nCo
34e10 70 79 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  py;..          i
34e20 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  f( nFromPageSize
34e30 3e 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b  >=nToPageSize ){
34e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 72  .            zFr
34e50 6f 6d 20 2b 3d 20 28 28 69 2d 31 29 2a 6e 54 6f  om += ((i-1)*nTo
34e60 50 61 67 65 53 69 7a 65 20 2d 20 28 28 69 46 72  PageSize - ((iFr
34e70 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53  om-1)*nFromPageS
34e80 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ize));.         
34e90 20 20 20 6e 43 6f 70 79 20 3d 20 6e 54 6f 50 61     nCopy = nToPa
34ea0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
34eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34ec0 20 20 20 20 20 7a 54 6f 20 2b 3d 20 28 28 28 69       zTo += (((i
34ed0 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67  From-1)*nFromPag
34ee0 65 53 69 7a 65 29 20 2d 20 28 69 2d 31 29 2a 6e  eSize) - (i-1)*n
34ef0 54 6f 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ToPageSize);.   
34f00 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d           nCopy =
34f10 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b 0a   nFromPageSize;.
34f20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
34f30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54         memcpy(zT
34f40 6f 2c 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79 29  o, zFrom, nCopy)
34f50 3b 0a 09 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
34f60 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67 65  rUnref(pFromPage
34f70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34f80 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
34f90 70 54 6f 50 61 67 65 20 29 20 73 71 6c 69 74 65  pToPage ) sqlite
34fa0 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 6f 50  3PagerUnref(pToP
34fb0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
34fc0 0a 20 20 2f 2a 20 49 66 20 74 68 69 6e 67 73 20  .  /* If things 
34fd0 68 61 76 65 20 77 6f 72 6b 65 64 20 73 6f 20 66  have worked so f
34fe0 61 72 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ar, the database
34ff0 20 66 69 6c 65 20 6d 61 79 20 6e 65 65 64 20 74   file may need t
35000 6f 20 62 65 20 0a 20 20 2a 2a 20 74 72 75 6e 63  o be .  ** trunc
35010 61 74 65 64 2e 20 54 68 65 20 63 6f 6d 70 6c 65  ated. The comple
35020 78 20 70 61 72 74 20 69 73 20 74 68 61 74 20 69  x part is that i
35030 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
35040 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 20 20   truncated to.  
35050 2a 2a 20 61 20 73 69 7a 65 20 74 68 61 74 20 69  ** a size that i
35060 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
35070 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 6e 54 6f   multiple of nTo
35080 50 61 67 65 53 69 7a 65 20 2d 20 74 68 65 20 63  PageSize - the c
35090 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65  urrent.  ** page
350a0 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
350b0 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61 74  e pager associat
350c0 65 64 20 77 69 74 68 20 42 2d 54 72 65 65 20 70  ed with B-Tree p
350d0 54 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  To..  **.  ** Fo
350e0 72 20 65 78 61 6d 70 6c 65 2c 20 73 61 79 20 74  r example, say t
350f0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
35100 70 54 6f 20 69 73 20 32 30 34 38 20 62 79 74 65  pTo is 2048 byte
35110 73 20 61 6e 64 20 74 68 65 20 6f 72 69 67 69 6e  s and the origin
35120 61 6c 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  al .  ** number 
35130 6f 66 20 70 61 67 65 73 20 69 73 20 35 20 28 31  of pages is 5 (1
35140 30 20 4b 42 20 66 69 6c 65 29 2e 20 49 66 20 70  0 KB file). If p
35150 46 72 6f 6d 20 68 61 73 20 61 20 70 61 67 65 20  From has a page 
35160 73 69 7a 65 20 6f 66 20 31 30 32 34 20 0a 20 20  size of 1024 .  
35170 2a 2a 20 62 79 74 65 73 20 61 6e 64 20 39 20 70  ** bytes and 9 p
35180 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 66  ages, then the f
35190 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
351a0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 39 4b 42  truncated to 9KB
351b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
351c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
351d0 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53    if( nFromPageS
351e0 69 7a 65 21 3d 6e 54 6f 50 61 67 65 53 69 7a 65  ize!=nToPageSize
351f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35200 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  3_file *pFile = 
35210 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
35220 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b  (pBtTo->pPager);
35230 0a 20 20 20 20 20 20 69 36 34 20 69 53 69 7a 65  .      i64 iSize
35240 20 3d 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67   = (i64)nFromPag
35250 65 53 69 7a 65 20 2a 20 28 69 36 34 29 6e 46 72  eSize * (i64)nFr
35260 6f 6d 50 61 67 65 3b 0a 20 20 20 20 20 20 69 36  omPage;.      i6
35270 34 20 69 4e 6f 77 20 3d 20 28 69 36 34 29 28 28  4 iNow = (i64)((
35280 6e 54 6f 50 61 67 65 3e 6e 4e 65 77 50 61 67 65  nToPage>nNewPage
35290 29 3f 6e 54 6f 50 61 67 65 3a 6e 4e 65 77 50 61  )?nToPage:nNewPa
352a0 67 65 29 20 2a 20 28 69 36 34 29 6e 54 6f 50 61  ge) * (i64)nToPa
352b0 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 69  geSize; .      i
352c0 36 34 20 69 50 65 6e 64 69 6e 67 20 3d 20 28 28  64 iPending = ((
352d0 69 36 34 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  i64)PENDING_BYTE
352e0 5f 50 41 47 45 28 70 42 74 54 6f 29 2d 31 29 20  _PAGE(pBtTo)-1) 
352f0 2a 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a  *(i64)nToPageSiz
35300 65 3b 0a 20 20 0a 20 20 20 20 20 20 61 73 73 65  e;.  .      asse
35310 72 74 28 20 69 53 69 7a 65 3c 3d 69 4e 6f 77 20  rt( iSize<=iNow 
35320 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43  );.  .      /* C
35330 6f 6d 6d 69 74 20 70 68 61 73 65 20 6f 6e 65 20  ommit phase one 
35340 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
35350 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  l file associate
35360 64 20 77 69 74 68 20 70 54 6f 20 0a 20 20 20 20  d with pTo .    
35370 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
35380 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
35390 61 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 73  a. It does not s
353a0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
353b0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69   file.      ** i
353c0 74 73 65 6c 66 2e 20 41 66 74 65 72 20 64 6f 69  tself. After doi
353d0 6e 67 20 74 68 69 73 20 69 74 20 69 73 20 73 61  ng this it is sa
353e0 66 65 20 74 6f 20 75 73 65 20 4f 73 54 72 75 6e  fe to use OsTrun
353f0 63 61 74 65 28 29 20 61 6e 64 20 6f 74 68 65 72  cate() and other
35400 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 41  .      ** file A
35410 50 49 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  PIs on the datab
35420 61 73 65 20 66 69 6c 65 20 64 69 72 65 63 74 6c  ase file directl
35430 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
35440 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54    pBtTo->db = pT
35450 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 72 63 20  o->db;.      rc 
35460 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
35470 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
35480 54 6f 2d 3e 70 50 61 67 65 72 2c 20 30 2c 20 30  To->pPager, 0, 0
35490 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
354a0 69 53 69 7a 65 3c 69 4e 6f 77 20 26 26 20 72 63  iSize<iNow && rc
354b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
354c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
354d0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 46  te3OsTruncate(pF
354e0 69 6c 65 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20  ile, iSize);.   
354f0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
35500 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74 20 63   The loop that c
35510 6f 70 69 65 64 20 64 61 74 61 20 66 72 6f 6d 20  opied data from 
35520 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74  database pFrom t
35530 6f 20 70 54 6f 20 64 69 64 20 6e 6f 74 0a 20 20  o pTo did not.  
35540 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20      ** populate 
35550 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  the locking page
35560 20 6f 66 20 64 61 74 61 62 61 73 65 20 70 54 6f   of database pTo
35570 2e 20 49 66 20 74 68 65 20 70 61 67 65 2d 73 69  . If the page-si
35580 7a 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 70  ze of.      ** p
35590 46 72 6f 6d 20 69 73 20 73 6d 61 6c 6c 65 72 20  From is smaller 
355a0 74 68 61 6e 20 74 68 61 74 20 6f 66 20 70 54 6f  than that of pTo
355b0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 6f 6d  , this means som
355c0 65 20 64 61 74 61 20 77 69 6c 6c 0a 20 20 20 20  e data will.    
355d0 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20 62 65    ** not have be
355e0 65 6e 20 63 6f 70 69 65 64 2e 20 0a 20 20 20 20  en copied. .    
355f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
35600 69 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65 73 20  is block copies 
35610 74 68 65 20 6d 69 73 73 69 6e 67 20 64 61 74 61  the missing data
35620 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 70   from database p
35630 46 72 6f 6d 20 74 6f 20 70 54 6f 20 0a 20 20 20  From to pTo .   
35640 20 20 20 2a 2a 20 75 73 69 6e 67 20 66 69 6c 65     ** using file
35650 20 41 50 49 73 2e 20 54 68 69 73 20 69 73 20 73   APIs. This is s
35660 61 66 65 20 62 65 63 61 75 73 65 20 61 74 20 74  afe because at t
35670 68 69 73 20 70 6f 69 6e 74 20 77 65 20 6b 6e 6f  his point we kno
35680 77 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  w that.      ** 
35690 61 6c 6c 20 6f 66 20 74 68 65 20 6f 72 69 67 69  all of the origi
356a0 6e 61 6c 20 64 61 74 61 20 66 72 6f 6d 20 70 54  nal data from pT
356b0 6f 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  o has been synce
356c0 64 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  d into the .    
356d0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
356e0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
356f0 20 69 74 20 77 6f 75 6c 64 20 62 65 20 73 61 66   it would be saf
35700 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  e to do anything
35710 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c   at.      ** all
35720 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
35730 20 66 69 6c 65 20 65 78 63 65 70 74 20 74 72 75   file except tru
35740 6e 63 61 74 65 20 69 74 20 74 6f 20 7a 65 72 6f  ncate it to zero
35750 20 62 79 74 65 73 2e 0a 20 20 20 20 20 20 2a 2f   bytes..      */
35760 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
35770 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 46 72 6f  QLITE_OK && nFro
35780 6d 50 61 67 65 53 69 7a 65 3c 6e 54 6f 50 61 67  mPageSize<nToPag
35790 65 53 69 7a 65 20 26 26 20 69 53 69 7a 65 3e 69  eSize && iSize>i
357a0 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
357b0 20 20 69 36 34 20 69 4f 66 66 3b 0a 20 20 20 20    i64 iOff;.    
357c0 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20      for(.       
357d0 20 20 20 69 4f 66 66 3d 69 50 65 6e 64 69 6e 67     iOff=iPending
357e0 3b 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  ; .          rc=
357f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
35800 66 66 3c 28 69 50 65 6e 64 69 6e 67 2b 6e 54 6f  ff<(iPending+nTo
35810 50 61 67 65 53 69 7a 65 29 3b 20 0a 20 20 20 20  PageSize); .    
35820 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46        iOff += nF
35830 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20  romPageSize.    
35840 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
35850 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61   DbPage *pFromPa
35860 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
35870 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28    Pgno iFrom = (
35880 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69  iOff/nFromPageSi
35890 7a 65 29 2b 31 3b 0a 20 20 0a 20 20 20 20 20 20  ze)+1;.  .      
358a0 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50      if( iFrom==P
358b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
358c0 28 70 42 74 46 72 6f 6d 29 20 7c 7c 20 69 46 72  (pBtFrom) || iFr
358d0 6f 6d 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a  om>nFromPage ){.
358e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
358f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
35900 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 72  }.  .          r
35910 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35920 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61  Get(pBtFrom->pPa
35930 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72  ger, iFrom, &pFr
35940 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  omPage);.       
35950 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35970 20 20 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20      char *zFrom 
35980 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
35990 74 44 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29  tData(pFromPage)
359a0 3b 0a 20 20 09 20 20 72 63 20 3d 20 73 71 6c 69  ;.  .  rc = sqli
359b0 74 65 33 4f 73 57 72 69 74 65 28 70 46 69 6c 65  te3OsWrite(pFile
359c0 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61  , zFrom, nFromPa
359d0 67 65 53 69 7a 65 2c 20 69 4f 66 66 29 3b 0a 20  geSize, iOff);. 
359e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
359f0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 46 72  e3PagerUnref(pFr
35a00 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  omPage);.       
35a10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
35a20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
35a30 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
35a40 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
35a50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35a70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35a80 72 53 79 6e 63 28 70 42 74 54 6f 2d 3e 70 50 61  rSync(pBtTo->pPa
35a90 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
35aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
35ab0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35ac0 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e  Truncate(pBtTo->
35ad0 70 50 61 67 65 72 2c 20 6e 4e 65 77 50 61 67 65  pPager, nNewPage
35ae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
35af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35b00 7b 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e 70  {.      pBtTo->p
35b10 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 30  ageSizeFixed = 0
35b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
35b30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
35b40 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
35b50 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72  k(pTo);.  }..  r
35b60 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e  eturn rc;  .}.in
35b70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
35b80 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54  pyFile(Btree *pT
35b90 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29  o, Btree *pFrom)
35ba0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
35bb0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
35bc0 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pTo);.  sqlite3B
35bd0 74 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d 29  treeEnter(pFrom)
35be0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 6f  ;.  rc = btreeCo
35bf0 70 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f  pyFile(pTo, pFro
35c00 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m);.  sqlite3Btr
35c10 65 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a  eeLeave(pFrom);.
35c20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
35c30 61 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74 75  ave(pTo);.  retu
35c40 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
35c50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
35c60 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  VACUUM */../*.**
35c70 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
35c80 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
35c90 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
35ca0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
35cb0 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20  IsInTrans(Btree 
35cc0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
35cd0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
35ce0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
35cf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
35d00 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e  urn (p && (p->in
35d10 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
35d20 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  TE));.}../*.** R
35d30 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
35d40 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  f a statement tr
35d50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
35d60 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
35d70 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74  te3BtreeIsInStmt
35d80 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
35d90 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
35da0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
35db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
35dc0 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69  pBt && p->pBt->i
35dd0 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nStmt);.}../*.**
35de0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
35df0 20 69 66 20 61 20 72 65 61 64 20 28 6f 72 20 77   if a read (or w
35e00 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
35e10 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
35e20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
35e30 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42 74  IsInReadTrans(Bt
35e40 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
35e50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
35e60 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
35e70 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
35e80 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e  (p && (p->inTran
35e90 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b  s!=TRANS_NONE));
35ea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
35eb0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
35ec0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
35ed0 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
35ee0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
35ef0 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65 64   a single shared
35f00 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f  -btree. The memo
35f10 72 79 20 69 73 20 75 73 65 64 20 62 79 20 63 6c  ry is used by cl
35f20 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69 74  ient code for it
35f30 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65  s own.** purpose
35f40 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s (for example, 
35f50 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68 2d  to store a high-
35f60 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73 73  level schema ass
35f70 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
35f80 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
35f90 65 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c 61  e). The btree la
35fa0 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66 65  yer manages refe
35fb0 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20 69  rence counting i
35fc0 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssues..**.** The
35fd0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
35fe0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   is called on a 
35ff0 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e 42  shared-btree, nB
36000 79 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d 65  ytes bytes of me
36010 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f  mory.** are allo
36020 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61  cated, zeroed, a
36030 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  nd returned to t
36040 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65  he caller. For e
36050 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 0a  ach subsequent .
36060 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79 74  ** call the nByt
36070 65 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  es parameter is 
36080 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70 6f  ignored and a po
36090 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61 6d  inter to the sam
360a0 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d  e blob.** of mem
360b0 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a  ory returned. .*
360c0 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65  *.** Just before
360d0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
360e0 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65  e is closed, the
360f0 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64   function passed
36100 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65   as the .** xFre
36110 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20  e argument when 
36120 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
36130 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69  ation was made i
36140 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65  s invoked on the
36150 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c   .** blob of all
36160 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54  ocated memory. T
36170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
36180 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c  uld not call sql
36190 69 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f  ite3_free().** o
361a0 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68  n the memory, th
361b0 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f  e btree layer do
361c0 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64  es that..*/.void
361d0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63   *sqlite3BtreeSc
361e0 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69  hema(Btree *p, i
361f0 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28  nt nBytes, void(
36200 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29  *xFree)(void *))
36210 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
36220 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
36230 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
36240 70 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  p);.  if( !pBt->
36250 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70  pSchema ){.    p
36260 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71  Bt->pSchema = sq
36270 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
36280 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42 74  nBytes);.    pBt
36290 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d 20  ->xFreeSchema = 
362a0 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  xFree;.  }.  sql
362b0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
362c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  );.  return pBt-
362d0 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a  >pSchema;.}../*.
362e0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
362f0 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20 6f  f another user o
36300 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72 65  f the same share
36310 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20 61  d btree as the a
36320 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c  rgument.** handl
36330 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  e holds an exclu
36340 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
36350 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
36360 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
36370 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c  ite3BtreeSchemaL
36380 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b  ocked(Btree *p){
36390 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
363a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
363b0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
363c0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
363d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
363e0 0a 20 20 72 63 20 3d 20 28 71 75 65 72 79 54 61  .  rc = (queryTa
363f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
36400 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
36410 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  K)!=SQLITE_OK);.
36420 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
36430 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
36440 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   rc;.}...#ifndef
36450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
36460 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
36470 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  Obtain a lock on
36480 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65   the table whose
36490 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54   root page is iT
364a0 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b  ab.  The.** lock
364b0 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   is a write lock
364c0 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20   if isWritelock 
364d0 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61  is true or a rea
364e0 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20  d lock.** if it 
364f0 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  is false..*/.int
36500 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63   sqlite3BtreeLoc
36510 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  kTable(Btree *p,
36520 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73   int iTab, u8 is
36530 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  WriteLock){.  in
36540 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36550 3b 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  ;.  if( p->shara
36560 62 6c 65 20 29 7b 0a 20 20 20 20 75 38 20 6c 6f  ble ){.    u8 lo
36570 63 6b 54 79 70 65 20 3d 20 52 45 41 44 5f 4c 4f  ckType = READ_LO
36580 43 4b 20 2b 20 69 73 57 72 69 74 65 4c 6f 63 6b  CK + isWriteLock
36590 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 52 45  ;.    assert( RE
365a0 41 44 5f 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54 45  AD_LOCK+1==WRITE
365b0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
365c0 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63 6b  ert( isWriteLock
365d0 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f  ==0 || isWriteLo
365e0 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c  ck==1 );.    sql
365f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
36600 29 3b 0a 20 20 20 20 72 63 20 3d 20 71 75 65 72  );.    rc = quer
36610 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
36620 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  ab, lockType);. 
36630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
36650 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
36660 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  iTab, lockType);
36670 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
36680 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
36690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
366a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
366b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
366c0 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41  INCRBLOB./*.** A
366d0 72 67 75 6d 65 6e 74 20 70 43 73 72 20 6d 75 73  rgument pCsr mus
366e0 74 20 62 65 20 61 20 63 75 72 73 6f 72 20 6f 70  t be a cursor op
366f0 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
36700 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45   on an .** INTKE
36710 59 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  Y table currentl
36720 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  y pointing at a 
36730 76 61 6c 69 64 20 74 61 62 6c 65 20 65 6e 74 72  valid table entr
36740 79 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  y. .** This func
36750 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74 68  tion modifies th
36760 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 61 73  e data stored as
36770 20 70 61 72 74 20 6f 66 20 74 68 61 74 20 65 6e   part of that en
36780 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  try..** Only the
36790 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61   data content ma
367a0 79 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69  y only be modifi
367b0 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ed, it is not po
367c0 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61  ssible.** to cha
367d0 6e 67 65 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  nge the length o
367e0 66 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65  f the data store
367f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
36800 33 42 74 72 65 65 50 75 74 44 61 74 61 28 42 74  3BtreePutData(Bt
36810 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 75 33  Cursor *pCsr, u3
36820 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
36830 74 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 61  t, void *z){.  a
36840 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
36850 64 73 4d 75 74 65 78 28 70 43 73 72 29 20 29 3b  dsMutex(pCsr) );
36860 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36870 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
36880 73 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  sr->pBtree->db->
36890 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
368a0 72 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72 62  rt(pCsr->isIncrb
368b0 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69 66  lobHandle);.  if
368c0 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCsr->eState>=
368d0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
368e0 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
368f0 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  sr->eState==CURS
36900 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
36910 20 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e 73    return pCsr->s
36920 6b 69 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  kip;.    }else{.
36930 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36940 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 7d  ITE_ABORT;.    }
36950 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
36960 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74 69   some preconditi
36970 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61 29  ons: .  **   (a)
36980 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
36990 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  pen for writing,
369a0 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65 72  .  **   (b) ther
369b0 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63  e is no read-loc
369c0 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62  k on the table b
369d0 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e  eing modified an
369e0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68 65  d.  **   (c) the
369f0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61   cursor points a
36a00 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f 66  t a valid row of
36a10 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
36a20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 43  ..  */.  if( !pC
36a30 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  sr->wrFlag ){.  
36a40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36a50 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
36a60 61 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e 70  assert( !pCsr->p
36a70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20  Bt->readOnly .  
36a80 20 20 20 20 20 20 20 20 26 26 20 70 43 73 72 2d          && pCsr-
36a90 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
36aa0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
36ab0 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52   );.  if( checkR
36ac0 65 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e 70  eadLocks(pCsr->p
36ad0 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e  Btree, pCsr->pgn
36ae0 6f 52 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b 0a  oRoot, pCsr) ){.
36af0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36b00 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65  E_LOCKED; /* The
36b10 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
36b20 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
36b30 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69   lock */.  }.  i
36b40 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d  f( pCsr->eState=
36b50 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
36b60 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61 67 65 2d  || !pCsr->pPage-
36b70 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
36b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
36b90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
36ba0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
36bb0 70 43 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCsr, offset, am
36bc0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
36bd0 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a  r *)z, 0, 1);.}.
36be0 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ./* .** Set a fl
36bf0 61 67 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f  ag on this curso
36c00 72 20 74 6f 20 63 61 63 68 65 20 74 68 65 20 6c  r to cache the l
36c10 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70 61 67 65  ocations of page
36c20 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f  s from the .** o
36c30 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72  verflow list for
36c40 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
36c50 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
36c60 79 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  y cursors opened
36c70 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e  .** for incremen
36c80 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79  tal blob IO only
36c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
36ca0 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c 61  ction sets a fla
36cb0 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74 75  g only. The actu
36cc0 61 6c 20 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e  al page location
36cd0 20 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65   cache.** (store
36ce0 64 20 69 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f  d in BtCursor.aO
36cf0 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c  verflow[]) is al
36d00 6c 6f 63 61 74 65 64 20 61 6e 64 20 75 73 65 64  located and used
36d10 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20   by function.** 
36d20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
36d30 28 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e 63  (the worker func
36d40 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33  tion for sqlite3
36d50 42 74 72 65 65 44 61 74 61 28 29 20 61 6e 64 0a  BtreeData() and.
36d60 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
36d70 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f  utData())..*/.vo
36d80 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
36d90 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74 43  acheOverflow(BtC
36da0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
36db0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
36dc0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
36dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36de0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36df0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
36e00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
36e10 65 72 74 28 21 70 43 75 72 2d 3e 69 73 49 6e 63  ert(!pCur->isInc
36e20 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20  rblobHandle);.  
36e30 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
36e40 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72  verflow);.  pCur
36e50 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
36e60 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  le = 1;.}.#endif
36e70 0a                                               .