/ Hex Artifact Content
Login

Artifact 134d2f76fb9144e81b6ca9e426922ac3626d1d77:


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 38 36 20 32 30 30 38 2f 30  c,v 1.486 2008/0
0190: 37 2f 31 38 20 30 32 3a 34 34 3a 31 38 20 64 72  7/18 02:44:18 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  eTrace=0;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69 6e  .** A flag to in
0450: 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20 6f  dicate whether o
0460: 72 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61 63  r not shared cac
0470: 68 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 20  he is enabled.  
0480: 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74 20  Also,.** a list 
0490: 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  of BtShared obje
04a0: 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c 69  cts that are eli
04b0: 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69 63  gible for partic
04c0: 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73 68  ipation.** in sh
04d0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
04e0: 20 76 61 72 69 61 62 6c 65 73 20 68 61 76 65 20   variables have 
04f0: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0500: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0510: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
0520: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
0530: 6f 20 61 63 63 65 73 73 20 74 68 65 73 65 20 76  o access these v
0540: 61 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20 6d  ariables so we m
0550: 61 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f 62  ake them.** glob
0560: 61 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69 6c  al for test buil
0570: 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ds..*/.#ifdef SQ
0580: 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72  LITE_TEST.BtShar
0590: 65 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72 65  ed *sqlite3Share
05a0: 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a  dCacheList = 0;.
05b0: 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72 65  int sqlite3Share
05c0: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20  dCacheEnabled = 
05d0: 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  0;.#else.static 
05e0: 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74 65  BtShared *sqlite
05f0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
0600: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
0610: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0620: 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  cheEnabled = 0;.
0630: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a  #endif.#endif /*
0640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
0650: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
0660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0670: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
0680: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
0690: 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65  isable the share
06a0: 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65  d pager and sche
06b0: 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a  ma features..**.
06c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
06d0: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e  has no effect on
06e0: 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
06f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
0700: 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61  ** The shared ca
0710: 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65  che setting effe
0720: 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20  cts only future 
0730: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
0740: 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69  te3_open(), sqli
0750: 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72  te3_open16(), or
0760: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
0770: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
0780: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
0790: 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c  _cache(int enabl
07a0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68 61  e){.  sqlite3Sha
07b0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
07c0: 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75  = enable;.  retu
07d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
07e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46  #endif.../*.** F
07f0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
0800: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
0810: 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
0820: 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20 42 74  Btree*, Pgno, Bt
0830: 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b 0a 0a  Cursor*, i64);..
0840: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0850: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0860: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
0870: 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61  unctions queryTa
0880: 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54  bleLock(), lockT
0890: 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63  able() and unloc
08a0: 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a  kAllTables().  *
08b0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
08c0: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
08d0: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
08e0: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
08f0: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0900: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0910: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0920: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0930: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0940: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0950: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0960: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0970: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0980: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0990: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
09a0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
09b0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
09c0: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
09d0: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
09e0: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
09f0: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0a00: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0a10: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  eryTableLock(a,b
0a20: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a30: 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c  #define lockTabl
0a40: 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  e(a,b,c) SQLITE_
0a50: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c  OK.  #define unl
0a60: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a  ockAllTables(a).
0a70: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0a80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0a90: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51  ED_CACHE./*.** Q
0aa0: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62  uery to see if b
0ab0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
0ac0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
0ad0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
0ae0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
0af0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
0b00: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
0b10: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
0b20: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
0b30: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
0b40: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
0b50: 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61  y calling lockTa
0b60: 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51  ble()), or.** SQ
0b70: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
0b80: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
0b90: 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  t queryTableLock
0ba0: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0bb0: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0bc0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0bd0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0be0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0bf0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0c00: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0c10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
0c20: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
0c30: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
0c40: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
0c50: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a   p->db!=0 );.  .
0c60: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
0c70: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
0c80: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
0c90: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
0ca0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
0cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0cc0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
0cd0: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
0ce0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
0cf0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
0d00: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
0d10: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
0d20: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
0d30: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
0d40: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
0d50: 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  && pBt->pExclusi
0d60: 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74  ve!=p ){.    ret
0d70: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
0d80: 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
0d90: 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f  s (along with lo
0da0: 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68  ckTable()) is wh
0db0: 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ere the ReadUnco
0dc0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a  mmitted flag is.
0dd0: 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e    ** dealt with.
0de0: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
0df0: 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61  s querying for a
0e00: 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74   read-lock and t
0e10: 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20  he flag is.  ** 
0e20: 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e  set, it is uncon
0e30: 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74  ditionally grant
0e40: 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65  ed - even if the
0e50: 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63  re are write-loc
0e60: 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74  ks.  ** on the t
0e70: 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65  able. If a write
0e80: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
0e90: 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ed, the ReadUnco
0ea0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a  mmitted flag.  *
0eb0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
0ec0: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  red..  **.  ** I
0ed0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54  n function lockT
0ee0: 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61  able(), if a rea
0ef0: 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64  d-lock is demand
0f00: 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ed and the .  **
0f10: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0f20: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f   flag is set, no
0f30: 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20   entry is added 
0f40: 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73  to the locks lis
0f50: 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65  t .  ** (BtShare
0f60: 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20  d.pLock)..  **. 
0f70: 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65   ** To summarize
0f80: 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63  : If the ReadUnc
0f90: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
0fa0: 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20   set, then read 
0fb0: 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20  cursors do.  ** 
0fc0: 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65  not create or re
0fd0: 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b  spect table lock
0fe0: 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70  s. The locking p
0ff0: 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a  rocedure for a .
1000: 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f    ** write-curso
1010: 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  r does not chang
1020: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  e..  */.  if( . 
1030: 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c     0==(p->db->fl
1040: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
1050: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a  ncommitted) || .
1060: 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45      eLock==WRITE
1070: 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61  _LOCK ||.    iTa
1080: 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  b==MASTER_ROOT. 
1090: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
10a0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
10b0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
10c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
10d0: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
10e0: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
10f0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a  Table==iTab && .
1100: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
1110: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c  ->eLock!=eLock |
1120: 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f  | eLock!=READ_LO
1130: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  CK) ){.        r
1140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1150: 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
1160: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1170: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1180: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
1190: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11a0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
11b0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11c0: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CACHE./*.** Add 
11d0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
11e0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
11f0: 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65  ge iTable to the
1200: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73   shared-btree us
1210: 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68  ed.** by Btree h
1220: 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74  andle p. Paramet
1230: 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er eLock must be
1240: 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43   either READ_LOC
1250: 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c  K or .** WRITE_L
1260: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
1270: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1280: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
1290: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
12a0: 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ly. SQLITE_BUSY 
12b0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  and.** SQLITE_NO
12c0: 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  MEM may also be 
12d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
12e0: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c  tic int lockTabl
12f0: 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
1300: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1310: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1320: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1330: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1340: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
1350: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
1360: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1370: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1380: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1390: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
13a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
13b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
13c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
13d0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
13e0: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
13f0: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1400: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1410: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1420: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1430: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
1440: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c  TE_OK==queryTabl
1450: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
1460: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
1470: 20 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63   If the read-unc
1480: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
1490: 20 73 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d   set and a read-
14a0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
14b0: 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65  d,.  ** return e
14c0: 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64  arly without add
14d0: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
14e0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
14f0: 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a  ck list. See.  *
1500: 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e  * comment in fun
1510: 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65  ction queryTable
1520: 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20  Lock() for more 
1530: 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67  info on handling
1540: 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55   .  ** the ReadU
1550: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e  ncommitted flag.
1560: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
1570: 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53   (p->db->flags&S
1580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1590: 69 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28  itted) && .    (
15a0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
15b0: 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21  ) &&.    iTable!
15c0: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
15d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15e0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
15f0: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
1600: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
1610: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
1620: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
1630: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1640: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1650: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1660: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
1670: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1680: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
1690: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
16a0: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
16b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16d0: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
16e0: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
16f0: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
1700: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
1710: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
1720: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
1730: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
1740: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
1750: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
1760: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
1770: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
1780: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
1790: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
17a0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
17b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
17d0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
17e0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
17f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
1800: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
1810: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1820: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
1830: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
1840: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
1850: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
1860: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
1870: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1880: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
1890: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
18a0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
18b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
18c0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
18d0: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
18e0: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
18f0: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
1900: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
1910: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
1920: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
1930: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
1940: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
1950: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
1960: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
1970: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
1980: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1990: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
19a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
19b0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
19c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
19d0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
19e0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
19f0: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
1a00: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
1a10: 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54  lls to the lockT
1a20: 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64  able().** proced
1a30: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1a40: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a  ee handle p..*/.
1a50: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1a60: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65  ckAllTables(Btre
1a70: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1a80: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1a90: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
1aa0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
1ab0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1ac0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1ad0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1ae0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
1af0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1b00: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
1b10: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
1b20: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
1b30: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1b40: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d  Bt->pExclusive==
1b50: 30 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75  0 || pBt->pExclu
1b60: 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  sive==pLock->pBt
1b70: 72 65 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ree );.    if( p
1b80: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
1b90: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
1ba0: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
1bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1bc0: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
1bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
1be0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
1bf0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
1c00: 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c    if( pBt->pExcl
1c10: 75 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20  usive==p ){.    
1c20: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
1c30: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
1c40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1c50: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1c60: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
1c70: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
1c80: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
1c90: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1ca0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
1cb0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
1cc0: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
1cd0: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
1ce0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1cf0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
1d00: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
1d10: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
1d20: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1d30: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
1d40: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
1d50: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1d60: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1d70: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
1d80: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1d90: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
1da0: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
1db0: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
1dc0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
1dd0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
1de0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1df0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e00: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1e20: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
1e30: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
1e40: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
1e50: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
1e60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1e70: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
1e80: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
1e90: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
1ea0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
1eb0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
1ec0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
1ed0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1ee0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
1ef0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1f10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1f20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1f30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
1f40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1f50: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
1f60: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1f70: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  p);.  }.}.#else.
1f80: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
1f90: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1fa0: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
1fb0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1fc0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e  flowCache(x).#en
1fd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  dif../*.** Save 
1fe0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
1ff0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
2000: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
2010: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
2020: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
2030: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
2040: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
2050: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2060: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
2070: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2080: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2090: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
20a0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
20b0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
20c0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
20d0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
20e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
20f0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2100: 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ur) );..  rc = s
2110: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
2120: 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e  ze(pCur, &pCur->
2130: 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nKey);..  /* If 
2140: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
2150: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
2160: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
2170: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
2180: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
2190: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
21a0: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
21b0: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
21c0: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
21d0: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
21e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
21f0: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
2200: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
2210: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
2220: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
2230: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
2240: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
2250: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
2260: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2270: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70  QLITE_OK && 0==p
2280: 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
2290: 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ey){.    void *p
22a0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
22b0: 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  loc(pCur->nKey);
22c0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
22d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22e0: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
22f0: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
2300: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
2310: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2320: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2330: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
2340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2350: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2360: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
2370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2380: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2390: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
23a0: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50  ssert( !pCur->pP
23b0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  age->intKey || !
23c0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
23d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23e0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
23f0: 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
2400: 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  e);.    pCur->pP
2410: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  age = 0;.    pCu
2420: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2430: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
2440: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
2450: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
2460: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
2470: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
2480: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2490: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  f all cursors ex
24a0: 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65  cept pExcept ope
24b0: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
24c0: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  ** with root-pag
24d0: 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79  e iRoot. Usually
24e0: 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  , this is called
24f0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
2500: 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69  sor.** pExcept i
2510: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
2520: 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65   the table (Btre
2530: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2540: 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a  eeInsert())..*/.
2550: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
2560: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
2570: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
2580: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
2590: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
25a0: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
25b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25c0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
25d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25e0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
25f0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
2600: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
2610: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2620: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
2630: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
2640: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
2650: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
2660: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
2670: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2680: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
2690: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
26a0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
26b0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
26c0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
26d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
26e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2700: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
2710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2720: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
2730: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43  atic void clearC
2740: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2750: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2760: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2770: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2780: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2790: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
27a0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
27b0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
27c0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
27d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
27e0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
27f0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
2800: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
2810: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
2820: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
2830: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2840: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
2850: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
2860: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
2870: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
2880: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
2890: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
28a0: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
28b0: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
28c0: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
28d0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
28e0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
28f0: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
2900: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
2910: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2920: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
2930: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
2940: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
2950: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
2960: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2970: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2980: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
2990: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
29a0: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
29b0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29c0: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
29d0: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
29e0: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
29f0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2a00: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71  VALID;.  rc = sq
2a10: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2a20: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
2a30: 79 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  y, 0, pCur->nKey
2a40: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
2a50: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2a70: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
2a80: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
2a90: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
2aa0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2ab0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ac0: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2ad0: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2ae0: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
2af0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
2b00: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
2b10: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
2b20: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
2b30: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
2b40: 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  \.         sqlit
2b50: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43 75  e3BtreeRestoreCu
2b60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2b70: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
2b80: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
2b90: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2ba0: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
2bb0: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
2bc0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
2bd0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
2be0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 20 63  ed at.  Cursor c
2bf0: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
2c00: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
2c10: 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20  inting.** at is 
2c20: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
2c30: 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a   under them..**.
2c40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2c50: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2c60: 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69   code if somethi
2c70: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20  ng goes wrong.  
2c80: 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a  The.** integer *
2c90: 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74  pHasMoved is set
2ca0: 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63   to one if the c
2cb0: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
2cc0: 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f  and 0 if not..*/
2cd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ce0: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
2cf0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d00: 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b  int *pHasMoved){
2d10: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
2d20: 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2d30: 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2d40: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d50: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a  *pHasMoved = 1;.
2d60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d70: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
2d80: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d90: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69  LID || pCur->ski
2da0: 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61  p!=0 ){.    *pHa
2db0: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  sMoved = 1;.  }e
2dc0: 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  lse{.    *pHasMo
2dd0: 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ved = 0;.  }.  r
2de0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2df0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2e00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e10: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2e30: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
2e40: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
2e50: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2e60: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
2e70: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
2e80: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
2e90: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
2ea0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
2eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
2ec0: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
2ed0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
2ee0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
2ef0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 2c  PagesPerMapPage,
2f00: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
2f10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2f30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
2f40: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
2f50: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2f60: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
2f70: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
2f80: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
2f90: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
2fa0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
2fb0: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
2fc0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2fd0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2fe0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
2ff0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
3000: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
3010: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
3020: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
3030: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
3040: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
3050: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
3060: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
3070: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
3080: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
3090: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
30a0: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
30b0: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
30c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
30d0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
30e0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
30f0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
3100: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
3110: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
3120: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
3130: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
3140: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
3150: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
3160: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3170: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
3180: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
3190: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
31a0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
31b0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
31c0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
31d0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
31e0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
31f0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
3200: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
3210: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3220: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3230: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3240: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
3250: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
3260: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
3270: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
3280: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3290: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
32a0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
32b0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
32c0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
32d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
32e0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
32f0: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
3300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
3310: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
3320: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3330: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
3340: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
3350: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
3360: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
3370: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
3380: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3390: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
33a0: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
33b0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
33c0: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  SET(pBt, key);. 
33d0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
33e0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
33f0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
3400: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
3410: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
3420: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
3430: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
3440: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
3450: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
3460: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
3470: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
3480: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
3490: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34a0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
34b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
34d0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
34e0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
34f0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3500: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
3510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
3520: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
3530: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
3540: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3550: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
3560: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
3570: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
3580: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
3590: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
35a0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
35b0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
35c0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
35d0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
35e0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
35f0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
3600: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
3610: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3620: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3630: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3640: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3660: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
3670: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
3680: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
3690: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
36a0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
36b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
36c0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
36d0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
36e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
36f0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
3700: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3710: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
3720: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
3730: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3740: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
3750: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
3760: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
3770: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3790: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
37a0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
37b0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
37c0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
37d0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
37e0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
37f0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
3800: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
3810: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
3820: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
3830: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
3840: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
3850: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
3860: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
3870: 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72  t, key);.  asser
3880: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
3890: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
38a0: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
38b0: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
38c0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
38d0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
38e0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
38f0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
3900: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
3910: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
3920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
3930: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
3940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3950: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3960: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
3970: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
3980: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
3990: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
39a0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
39b0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
39c0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
39d0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
39e0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
39f0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
3a00: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
3a10: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
3a20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
3a30: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
3a40: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
3a50: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
3a60: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
3a70: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
3a80: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
3a90: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
3aa0: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
3ab0: 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c  >aData[(P)->cell
3ac0: 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29  Offset+2*(I)])))
3ad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
3ae0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
3af0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
3b00: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
3b10: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
3b20: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
3b30: 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69  ow cells.  See i
3b40: 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20  nsert.*/.static 
3b50: 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77  u8 *findOverflow
3b60: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
3b70: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
3b80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
3b90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3ba0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
3bb0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3bc0: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
3bd0: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
3be0: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
3bf0: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
3c00: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
3c10: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
3c20: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
3c30: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
3c40: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
3c50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
3c60: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
3c70: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
3c80: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
3c90: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
3ca0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3cb0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
3cc0: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
3cd0: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
3ce0: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
3cf0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
3d00: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
3d10: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
3d20: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
3d30: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71  is function.  sq
3d40: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3d50: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
3d60: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
3d70: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
3d80: 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42  ent and sqlite3B
3d90: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
3da0: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
3db0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
3dc0: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
3dd0: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
3de0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
3df0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
3e00: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
3e10: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
3e20: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
3e30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
3e40: 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69  seCellPtr(). Usi
3e50: 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  ng some compiler
3e60: 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
3e70: 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  faster..*/.void 
3e80: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
3e90: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
3ea0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
3eb0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
3ec0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
3ed0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ef0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
3f00: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
3f10: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
3f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
3f30: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
3f40: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20   */.){.  int n; 
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73   /* Number bytes
3f70: 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   in cell content
3f80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
3f90: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
3fa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3fb0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
3fc0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
3fd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3fe0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
3ff0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
4000: 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d    pInfo->pCell =
4010: 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74   pCell;.  assert
4020: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
4030: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
4040: 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67  =1 );.  n = pPag
4050: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
4060: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d  .  assert( n==4-
4070: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
4080: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
4090: 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20  tKey ){.    if( 
40a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
40b0: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74  {.      n += get
40c0: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
40d0: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
40e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
40f0: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
4100: 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74    }.    n += get
4110: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
4120: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
4130: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
4140: 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f  ->nData = nPaylo
4150: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
4160: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
4170: 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  0;.    n += getV
4180: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
4190: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
41a0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
41b0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
41c0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
41d0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
41e0: 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e  nfo->nHeader = n
41f0: 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e  ;.  if( likely(n
4200: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
4210: 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  maxLocal) ){.   
4220: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
4230: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
4240: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
4250: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
4260: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
4270: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
4280: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
4290: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
42a0: 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
42b0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
42c0: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
42d0: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
42e0: 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f    nSize = nPaylo
42f0: 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66  ad + n;.    pInf
4300: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79  o->nLocal = nPay
4310: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
4320: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
4330: 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26      if( (nSize &
4340: 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   ~3)==0 ){.     
4350: 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20   nSize = 4;     
4360: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
4370: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
4380: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
4390: 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a  >nSize = nSize;.
43a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
43b0: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
43c0: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
43d0: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
43e0: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
43f0: 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69  e.    ** to deci
4400: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
4410: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
4420: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
4430: 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f  ll onto.    ** o
4440: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
4450: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
4460: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
4470: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
4480: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e  .    ** space on
4490: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
44a0: 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68  while keeping th
44b0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61  e amount of loca
44c0: 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a  l storage.    **
44d0: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
44e0: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
44f0: 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
4500: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
4510: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
4520: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
4530: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
4540: 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69  ny.    ** way wi
4550: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
4560: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
4570: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f  e format..    */
4580: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
4590: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
45a0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
45b0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
45c0: 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  .    int maxLoca
45d0: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
45e0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
45f0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
4600: 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73  .    int surplus
4610: 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  ;   /* Overflow 
4620: 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c  payload availabl
4630: 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72  e for local stor
4640: 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c  age */..    minL
4650: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
4660: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c  nLocal;.    maxL
4670: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
4680: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70  xLocal;.    surp
4690: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
46a0: 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e   (nPayload - min
46b0: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
46c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
46d0: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72   4);.    if( sur
46e0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
46f0: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
4700: 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75  >nLocal = surplu
4710: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
4720: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
4730: 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  l = minLocal;.  
4740: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
4750: 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f  Overflow = pInfo
4760: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20  ->nLocal + n;.  
4770: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
4780: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
4790: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
47a0: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
47b0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
47c0: 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42  fo) \.  sqlite3B
47d0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
47e0: 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65  ((pPage), findCe
47f0: 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65  ll((pPage), (iCe
4800: 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76  ll)), (pInfo)).v
4810: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
4820: 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d  ParseCell(.  Mem
4830: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
4840: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
4850: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
4860: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c   */.  int iCell,
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4880: 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e   The cell index.
4890: 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20    First cell is 
48a0: 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  0 */.  CellInfo 
48b0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
48c0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
48d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
48e0: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
48f0: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , iCell, pInfo);
4900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
4910: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
4920: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
4930: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
4940: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
4950: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
4960: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
4970: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
4980: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
4990: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
49a0: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
49b0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
49c0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
49d0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
49e0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
49f0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e  pointer..*/.#ifn
4a00: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
4a10: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d  c u16 cellSize(M
4a20: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
4a30: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  nt iCell){.  Cel
4a40: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71  lInfo info;.  sq
4a50: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4a60: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4a70: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
4a80: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
4a90: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 75  .#endif.static u
4aa0: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
4ab0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
4ac0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
4ad0: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71  lInfo info;.  sq
4ae0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4af0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
4b00: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72  ell, &info);.  r
4b10: 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65  eturn info.nSize
4b20: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
4b30: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
4b40: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
4b50: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
4b60: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
4b70: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
4b80: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
4b90: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
4ba0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
4bb0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
4bc0: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
4bd0: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
4be0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
4bf0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
4c00: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
4c10: 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ll){.  CellInfo 
4c20: 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20  info;.  assert( 
4c30: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71  pCell!=0 );.  sq
4c40: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4c50: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
4c60: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
4c70: 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
4c80: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4c90: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
4ca0: 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
4cb0: 3b 0a 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44  ;.  if( (info.nD
4cc0: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
4cd0: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
4ce0: 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
4cf0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
4d00: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
4d10: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
4d20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  ;.    return ptr
4d30: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
4d40: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
4d50: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
4d60: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
4d70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4d80: 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .}./*.** If the 
4d90: 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20  cell with index 
4da0: 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50  iCell on page pP
4db0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
4dc0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
4dd0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
4de0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
4df0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
4e00: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
4e10: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
4e20: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
4e30: 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67  apPutOvfl(MemPag
4e40: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
4e50: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c  ell){.  u8 *pCel
4e60: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  l;.  assert( sql
4e70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4e80: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
4e90: 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  x) );.  pCell = 
4ea0: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
4eb0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
4ec0: 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
4ed0: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
4ee0: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   pCell);.}.#endi
4ef0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67  f.../*.** Defrag
4f00: 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69  ment the page gi
4f10: 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20  ven.  All Cells 
4f20: 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
4f30: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70  .** end of the p
4f40: 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65  age and all free
4f50: 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63   space is collec
4f60: 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20  ted into one.** 
4f70: 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74  big FreeBlk that
4f80: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
4f90: 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  en the header an
4fa0: 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65  d cell.** pointe
4fb0: 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20  r array and the 
4fc0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
4fd0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
4fe0: 64 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  d defragmentPage
4ff0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5000: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5020: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
5030: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5050: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
5060: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
5070: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
5080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
5090: 65 74 20 6f 66 20 66 69 72 73 74 20 62 79 74 65  et of first byte
50a0: 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e   after cell poin
50b0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
50c0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
50d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
50e0: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
50f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
5100: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
5110: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
5120: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
5130: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5150: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
5160: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
5170: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
5180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5190: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
51a0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
51b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20   */.  int brk;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
51e0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
51f0: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
5200: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
5210: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5220: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
5230: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
5240: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
5250: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
5260: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
5270: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
5280: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
5290: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
52a0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
52b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
52c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
52d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
52e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
52f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5300: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
5310: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
5320: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
5330: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5340: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
5350: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5360: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5370: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5380: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
5390: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
53a0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
53b0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
53c0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
53d0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
53e0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
53f0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5400: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
5410: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
5420: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
5430: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
5440: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
5450: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
5460: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
5470: 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20 67  eSize;.  brk = g
5480: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5490: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
54a0: 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61 74  &temp[brk], &dat
54b0: 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
54c0: 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72 6b  ze - brk);.  brk
54d0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
54e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
54f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
5500: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
5510: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
5520: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
5530: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
5540: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
5550: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
5560: 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Addr);.    asser
5570: 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74  t( pc<pPage->pBt
5580: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5590: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
55a0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
55b0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62 72  emp[pc]);.    br
55c0: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d  k -= size;.    m
55d0: 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b 5d  emcpy(&data[brk]
55e0: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
55f0: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
5600: 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20 20  (pAddr, brk);.  
5610: 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b 3e  }.  assert( brk>
5620: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
5630: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
5640: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
5650: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
5660: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
5670: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
5680: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
5690: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
56a0: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
56b0: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
56c0: 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b 0a  , 0, brk-addr);.
56d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
56e0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
56f0: 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65   space on a page
5700: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
5710: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
5720: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20  age->aData[] of 
5730: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
5740: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c  f.** the new all
5750: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61  ocation.  The ca
5760: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
5770: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
5780: 6f 75 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20  ough.** space.  
5790: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
57a0: 6c 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a  l never fail..**
57b0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
57c0: 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20  contains nBytes 
57d0: 6f 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75  of free space bu
57e0: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
57f0: 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20  in.** nBytes of 
5800: 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20  contiguous free 
5810: 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73  space, then this
5820: 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74   routine automat
5830: 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20  ically.** calls 
5840: 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28  defragementPage(
5850: 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65  ) to consolidate
5860: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
5870: 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63  before .** alloc
5880: 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68  ating the new ch
5890: 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  unk..*/.static i
58a0: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
58b0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
58c0: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
58d0: 6e 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72  nt addr, pc, hdr
58e0: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  ;.  int size;.  
58f0: 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74  int nFrag;.  int
5900: 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c   top;.  int nCel
5910: 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  l;.  int cellOff
5920: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
5930: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20  char *data;.  . 
5940: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
5950: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
5960: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5970: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5980: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5990: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
59a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
59b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
59c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
59d0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
59e0: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
59f0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
5a00: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
5a10: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
5a20: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
5a30: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
5a40: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50  rflow==0 );.  pP
5a50: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42  age->nFree -= nB
5a60: 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  yte;.  hdr = pPa
5a70: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a  ge->hdrOffset;..
5a80: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
5a90: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
5aa0: 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ag<60 ){.    /* 
5ab0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
5ac0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
5ad0: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
5ae0: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
5af0: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65  .    ** space re
5b00: 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64  quest. */.    ad
5b10: 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20  dr = hdr+1;.    
5b20: 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74  while( (pc = get
5b30: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5b40: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ]))>0 ){.      s
5b50: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
5b60: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
5b70: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
5b80: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
5b90: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
5ba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5bb0: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
5bc0: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
5bd0: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
5be0: 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73  r+7] = nFrag + s
5bf0: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5c00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5c10: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5c20: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
5c30: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
5c40: 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20   size-nByte);.  
5c50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
5c60: 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  c + size - nByte
5c70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5c80: 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
5c90: 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   pc;.    }.  }..
5ca0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
5cb0: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
5cc0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
5cd0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
5ce0: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
5cf0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
5d00: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
5d10: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5d20: 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c  hdr+5]);.  nCell
5d30: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5d40: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c  a[hdr+3]);.  cel
5d50: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5d60: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69  >cellOffset;.  i
5d70: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20  f( nFrag>=60 || 
5d80: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5d90: 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79  Cell > top - nBy
5da0: 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67  te ){.    defrag
5db0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
5dc0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
5dd0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5de0: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
5df0: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
5e00: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
5e10: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
5e20: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5e30: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
5e40: 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a   return top;.}..
5e50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
5e60: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
5e70: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
5e80: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
5e90: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
5ea0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
5eb0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
5ec0: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
5ed0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
5ee0: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
5ef0: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
5f00: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
5f10: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
5f20: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
5f30: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
5f40: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
5f50: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
5f60: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
5f70: 76 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d  void freeSpace(M
5f80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5f90: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
5fa0: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
5fb0: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
5fc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
5fd0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
5fe0: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
5ff0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
6000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6010: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6020: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6030: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6040: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
6050: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
6060: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
6070: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
6080: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
6090: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
60a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
60b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
60c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
60d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
60e0: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
60f0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
6100: 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66   is 4 */..#ifdef
6110: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
6120: 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77  ELETE.  /* Overw
6130: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
6140: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
6150: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43  ros when the SEC
6160: 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a  URE_DELETE .  **
6170: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
6180: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
6190: 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  me */.  memset(&
61a0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
61b0: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  size);.#endif.. 
61c0: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
61d0: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
61e0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
61f0: 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68  reeblocks */.  h
6200: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
6210: 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20  ffset;.  addr = 
6220: 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  hdr + 1;.  while
6230: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
6240: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
6250: 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67  ))<start && pbeg
6260: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  in>0 ){.    asse
6270: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
6280: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6290: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  ze-4 );.    asse
62a0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
62b0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62  );.    addr = pb
62c0: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egin;.  }.  asse
62d0: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
62e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
62f0: 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-4 );.  assert
6300: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c  ( pbegin>addr ||
6310: 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20   pbegin==0 );.  
6320: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  put2byte(&data[a
6330: 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20  ddr], start);.  
6340: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
6350: 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a  tart], pbegin);.
6360: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
6370: 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29  [start+2], size)
6380: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
6390: 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20   += size;..  /* 
63a0: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
63b0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
63c0: 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d  .  addr = pPage-
63d0: 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a  >hdrOffset + 1;.
63e0: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
63f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6400: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
6410: 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73     int pnext, ps
6420: 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
6430: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
6440: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6450: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
6460: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
6470: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
6480: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
6490: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
64a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
64b0: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
64c0: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
64d0: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
64e0: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
64f0: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
6500: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
6510: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
6520: 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b  ert( frag<=data[
6530: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6540: 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74  +7] );.      dat
6550: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
6560: 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20  et+7] -= frag;. 
6570: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
6580: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74  ata[pbegin], get
6590: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
65a0: 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32  t]));.      put2
65b0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
65c0: 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32  n+2], pnext+get2
65d0: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
65e0: 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20  +2])-pbegin);.  
65f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6600: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6610: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6620: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6630: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
6640: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
6650: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
6660: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
6670: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
6680: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
6690: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
66a0: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
66b0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
66c0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
66d0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
66e0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
66f0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
6700: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
6710: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
6720: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
6730: 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74  dr+5], top + get
6740: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6750: 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  in+2]));.  }.}..
6760: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
6770: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
6780: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
6790: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
67a0: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
67b0: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
67c0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
67d0: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
67e0: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
67f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
6800: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
6810: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
6820: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
6830: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
6840: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
6850: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
6860: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
6870: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
6880: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
6890: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
68a0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
68b0: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
68c0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
68d0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
68e0: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
68f0: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
6900: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
6910: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
6920: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
6930: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
6940: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
6950: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
6960: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
6970: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
6980: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
6990: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
69a0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
69b0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
69c0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 66   pPage->leaf = f
69d0: 6c 61 67 42 79 74 65 3e 3e 33 3b 20 20 61 73 73  lagByte>>3;  ass
69e0: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
69f0: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
6a00: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
6a10: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
6a20: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
6a30: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74  age->leaf;.  pBt
6a40: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
6a50: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
6a60: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
6a70: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
6a80: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6a90: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
6aa0: 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d  hasData = pPage-
6ab0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
6ac0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
6ad0: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
6ae0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
6af0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
6b00: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
6b10: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
6b20: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
6b30: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
6b40: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
6b50: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
6b60: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
6b70: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
6b80: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
6b90: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
6ba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6bb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6bc0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
6bd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6be0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
6bf0: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
6c00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
6c10: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
6c20: 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
6c30: 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
6c40: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
6c50: 74 68 65 20 4d 65 6d 50 61 67 65 20 77 68 69 63  the MemPage whic
6c60: 68 0a 2a 2a 20 69 73 20 74 68 65 20 70 61 72 65  h.** is the pare
6c70: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 62  nt of the page b
6c80: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
6c90: 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61  .  The root of a
6ca0: 0a 2a 2a 20 42 54 72 65 65 20 68 61 73 20 6e 6f  .** BTree has no
6cb0: 20 70 61 72 65 6e 74 20 61 6e 64 20 73 6f 20 66   parent and so f
6cc0: 6f 72 20 74 68 61 74 20 70 61 67 65 2c 20 70 50  or that page, pP
6cd0: 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a  arent==NULL..**.
6ce0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
6cf0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
6d00: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
6d10: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
6d20: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
6d30: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
6d40: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
6d50: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
6d60: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
6d70: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
6d80: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
6d90: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
6da0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
6db0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
6dc0: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
6dd0: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
6de0: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
6df0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  rruption..*/.int
6e00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
6e10: 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  tPage(.  MemPage
6e20: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
6e30: 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
6e40: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
6e50: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
6e60: 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ent       /* The
6e70: 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20   parent.  Might 
6e80: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6e90: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
6ea0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6eb0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
6ec0: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
6ed0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  [] */.  int hdr;
6ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6ef0: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
6f00: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
6f10: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
6f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
6f30: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
6f40: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
6f50: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
6f60: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
6f70: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
6f80: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
6f90: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
6fa0: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
6fb0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ch page */.  int
6fc0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
6fd0: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
6fe0: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
6ff0: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
7000: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
7010: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
7020: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
7030: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
7040: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
7050: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
7060: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
7070: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
7080: 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67  */..  pBt = pPag
7090: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
70a0: 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ( pBt!=0 );.  as
70b0: 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30  sert( pParent==0
70c0: 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74   || pParent->pBt
70d0: 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ==pBt );.  asser
70e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
70f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7100: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7110: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
7120: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
7130: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
7140: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
7150: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
7160: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
7170: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
7180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7190: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
71a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
71b0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
71c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
71d0: 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20  Parent!=pParent 
71e0: 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65  && (pPage->pPare
71f0: 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  nt!=0 || pPage->
7200: 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f  isInit) ){.    /
7210: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67  * The parent pag
7220: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63  e should never c
7230: 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65  hange unless the
7240: 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
7250: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
7260: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7270: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  PT;.  }.  if( pP
7280: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65  age->isInit ) re
7290: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
72a0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
72b0: 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65  rent==0 && pPare
72c0: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  nt!=0 ){.    pPa
72d0: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ge->pParent = pP
72e0: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
72f0: 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
7300: 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
7310: 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  }.  hdr = pPage-
7320: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
7330: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7340: 61 3b 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46  a;.  if( decodeF
7350: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
7360: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
7370: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7380: 4b 50 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70  KPT;.  assert( p
7390: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
73a0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
73b0: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70  ze<=32768 );.  p
73c0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
73d0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
73e0: 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76   1;.  pPage->nOv
73f0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50  erflow = 0;.  pP
7400: 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
7410: 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  0;.  usableSize 
7420: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
7430: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  e;.  pPage->cell
7440: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
7450: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
7460: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
7470: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
7480: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
7490: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
74a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
74b0: 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70  hdr+3]);.  if( p
74c0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
74d0: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
74e0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
74f0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
7500: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
7510: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
7520: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7530: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7540: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7550: 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
7560: 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61 72  arent!=0 && pPar
7570: 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a  ent->pgno!=1 ){.
7580: 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73      /* All pages
7590: 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65   must have at le
75a0: 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78  ast one cell, ex
75b0: 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70 61  cept for root pa
75c0: 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ges */.    retur
75d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
75e0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
75f0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
7600: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
7610: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70   the page */.  p
7620: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
7630: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46  ta[hdr+1]);.  nF
7640: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
7650: 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f  ] + top - (cellO
7660: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
7670: 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65  >nCell);.  while
7680: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  ( pc>0 ){.    in
7690: 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  t next, size;.  
76a0: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
76b0: 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f  ize-4 ){.      /
76c0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  * Free block is 
76d0: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
76e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
76f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7700: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78  ; .    }.    nex
7710: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
7720: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a  ta[pc]);.    siz
7730: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
7740: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
7750: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
7760: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
7770: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
7780: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
7790: 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
77a0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
77b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
77c0: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
77d0: 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20  nFree += size;. 
77e0: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
77f0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
7800: 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28 20   = nFree;.  if( 
7810: 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a  nFree>=usableSiz
7820: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65  e ){.    /* Free
7830: 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78   space cannot ex
7840: 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20  ceed total page 
7850: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  size */.    retu
7860: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7870: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 23 69  T_BKPT; .  }..#i
7880: 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  f 0.  /* Check t
7890: 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66 73  hat all the offs
78a0: 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 20  ets in the cell 
78b0: 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72 65  offset array are
78c0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 0a   within range. .
78d0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74 74    ** .  ** Omitt
78e0: 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73 74  ing this consist
78f0: 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20 75  ency check and u
7900: 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d 3e  sing the pPage->
7910: 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20 20  maskPage mask.  
7920: 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 76  ** to prevent ov
7930: 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70 61  errunning the pa
7940: 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69 6e  ge buffer in fin
7950: 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73 20  dCell() results 
7960: 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20 70  in a.  ** 2.5% p
7970: 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e 2e  erformance gain.
7980: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 38  .  */.  {.    u8
7990: 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20 2f   *pOff;        /
79a0: 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
79b0: 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65 6c  to check all cel
79c0: 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69 6e  l offsets are in
79d0: 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75 38   range */.    u8
79e0: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 2f   *pEnd;        /
79f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 64  * Pointer to end
7a00: 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 20   of cell offset 
7a10: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38 20  array */.    u8 
7a20: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a  mask;         /*
7a30: 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 68   Mask of bits th
7a40: 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 20  at must be zero 
7a50: 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20 6f  in MSB of cell o
7a60: 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d 61  ffsets */.    ma
7a70: 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42 74  sk = ~(((u8)(pBt
7a80: 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29 2d  ->pageSize>>8))-
7a90: 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26  1);.    pEnd = &
7aa0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
7ab0: 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32  + pPage->nCell*2
7ac0: 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66 3d  ];.    for(pOff=
7ad0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
7ae0: 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26 26  ]; pOff!=pEnd &&
7af0: 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b 29   !((*pOff)&mask)
7b00: 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20 20  ; pOff+=2);.    
7b10: 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20 29  if( pOff!=pEnd )
7b20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7b30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7b40: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  PT;.    }.  }.#e
7b50: 6e 64 69 66 0a 0a 20 20 70 50 61 67 65 2d 3e 69  ndif..  pPage->i
7b60: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  sInit = 1;.  ret
7b70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7b80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
7b90: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
7ba0: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
7bb0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
7bc0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
7bd0: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
7be0: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
7bf0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
7c00: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
7c10: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7c20: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
7c30: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
7c40: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
7c50: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
7c60: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
7c70: 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  nt first;..  ass
7c80: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
7c90: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
7ca0: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
7cb0: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
7cc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7cd0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
7ce0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
7cf0: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
7d00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7d10: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
7d20: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
7d30: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
7d40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
7d50: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
7d60: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
7d70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7d80: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7d90: 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  tex) );.  memset
7da0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
7db0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7dc0: 2d 20 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68  - hdr);.  data[h
7dd0: 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66  dr] = flags;.  f
7de0: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
7df0: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
7e00: 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73  EAF)==0);.  mems
7e10: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
7e20: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
7e30: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
7e40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
7e50: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
7e60: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
7e70: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
7e80: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
7e90: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7ea0: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
7eb0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
7ec0: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
7ed0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
7ee0: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
7ef0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
7f00: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
7f10: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
7f20: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
7f30: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
7f40: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
7f50: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
7f60: 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
7f70: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
7f80: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
7f90: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  sInit = 1;.}../*
7fa0: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
7fb0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
7fc0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
7fd0: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
7fe0: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
7ff0: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
8000: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
8010: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
8020: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
8030: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
8040: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
8050: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
8060: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
8070: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
8080: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
8090: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
80a0: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
80b0: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
80c0: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
80d0: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
80e0: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
80f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
8100: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
8110: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
8120: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
8130: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
8140: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
8150: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
8160: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
8170: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
8180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
8190: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
81a0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
81b0: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
81c0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
81d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
81e0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
81f0: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
8200: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
8210: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
8220: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
8230: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
8240: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
8250: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
8260: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
8270: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
8280: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
8290: 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61 67 65  *pPage;.  DbPage
82a0: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
82b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
82c0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
82d0: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
82e0: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
82f0: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
8300: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
8310: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
8320: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
8330: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
8340: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
8350: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
8360: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
8370: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
8380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8390: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
83a0: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
83b0: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
83c0: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
83d0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
83e0: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
83f0: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
8400: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
8410: 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   0;.  *ppPage = 
8420: 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  pPage;.  return 
8430: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8440: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
8450: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
8460: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
8470: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
8480: 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76  * is just a conv
8490: 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20  enience wrapper 
84a0: 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20  around separate 
84b0: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
84c0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
84d0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72  ) and sqlite3Btr
84e0: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f  eeInitPage()..*/
84f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
8500: 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
8510: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
8520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
8530: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
8540: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
8550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8560: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
8570: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
8580: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
8590: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
85a0: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
85b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
85c0: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f       /* Parent o
85d0: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 29 7b  f the page */.){
85e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
85f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8600: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
8610: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
8620: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
8630: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8640: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72  T_BKPT; .  }.  r
8650: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
8660: 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
8670: 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
8680: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8690: 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d  OK && (*ppPage)-
86a0: 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
86b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
86c0: 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
86d0: 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
86e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
86f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
8700: 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
8710: 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
8720: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
8730: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8740: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
8750: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
8760: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
8770: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
8780: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
8790: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
87a0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
87b0: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
87c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
87d0: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
87e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
87f0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
8800: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
8810: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
8820: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
8830: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
8840: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
8850: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
8860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8870: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
8880: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
8890: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
88a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
88b0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
88c0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
88d0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
88e0: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
88f0: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
8900: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8910: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
8920: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
8930: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  unt for a page.*
8940: 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  * reaches zero. 
8950: 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65   We need to unre
8960: 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f  f the pParent po
8970: 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a  inter when that.
8980: 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73  ** happens..*/.s
8990: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44  tatic void pageD
89a0: 65 73 74 72 75 63 74 6f 72 28 44 62 50 61 67 65  estructor(DbPage
89b0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67   *pData, int pag
89c0: 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67  eSize){.  MemPag
89d0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
89e0: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
89f0: 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  7)==0 );.  pPage
8a00: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
8a10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8a20: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
8a30: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
8a40: 69 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  it==0 || sqlite3
8a50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8a60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8a70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
8a80: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65  Parent ){.    Me
8a90: 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d  mPage *pParent =
8aa0: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
8ab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8ac0: 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50 61 67 65  rent->pBt==pPage
8ad0: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 70 50 61  ->pBt );.    pPa
8ae0: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
8af0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
8b00: 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  (pParent);.  }. 
8b10: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
8b20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72   0;.}../*.** Dur
8b30: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
8b40: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
8b50: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
8b60: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
8b70: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
8b80: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
8b90: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
8ba0: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
8bb0: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
8bc0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
8bd0: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
8be0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
8bf0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
8c00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
8c10: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
8c20: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
8c30: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
8c40: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
8c50: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
8c60: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
8c70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8c80: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
8c90: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67   *pData, int pag
8ca0: 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67  eSize){.  MemPag
8cb0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
8cc0: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
8cd0: 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  7)==0 );.  pPage
8ce0: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
8cf0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8d00: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
8d10: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
8d20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
8d30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8d40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8d50: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
8d60: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
8d70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
8d80: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
8d90: 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
8da0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
8db0: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
8dc0: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
8dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8de0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b  qlite3BtreeInvok
8df0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
8e00: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 29 7b  d *pArg, int n){
8e10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
8e20: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
8e30: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
8e40: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
8e50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8e60: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
8e70: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
8e80: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
8e90: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
8ea0: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
8eb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
8ec0: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
8ed0: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
8ee0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
8ef0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8f00: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
8f10: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20  me is NULL.** a 
8f20: 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74  new database wit
8f30: 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20  h a random name 
8f40: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69  is created.  Thi
8f50: 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64  s randomly named
8f60: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
8f70: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
8f80: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  d when sqlite3Bt
8f90: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
8fa0: 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  lled..** If zFil
8fb0: 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
8fc0: 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
8fd0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
8fe0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
8ff0: 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
9000: 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
9010: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
9020: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
9030: 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  reeOpen(.  const
9040: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
9050: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
9060: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
9070: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
9080: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
9090: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
90a0: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
90b0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
90c0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
90d0: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
90e0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
90f0: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
9100: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
9110: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
9120: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
9130: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
9140: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
9150: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
9160: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
9170: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
9180: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
9190: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20   *pVfs;      /* 
91a0: 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66  The VFS to use f
91b0: 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  or this btree */
91c0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
91d0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 68   = 0;      /* Sh
91e0: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
91f0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
9200: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
9210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
9220: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
9230: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9240: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65  TE_OK;.  int nRe
9250: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
9260: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
9270: 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74  [100];..  /* Set
9280: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
9290: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
92a0: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
92b0: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
92c0: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
92d0: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
92e0: 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69  e. This symbol i
92f0: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
9300: 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  if.  ** either o
9310: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
9320: 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20  a or autovacuum 
9330: 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d  features are com
9340: 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f  piled .  ** into
9350: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20   the library..  
9360: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
9370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
9380: 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65  ED_CACHE) || !de
9390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
93a0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20  T_AUTOVACUUM).  
93b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
93c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
93d0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
93e0: 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20  b = 0;.  #else. 
93f0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
9400: 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  emdb = zFilename
9410: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c   && !strcmp(zFil
9420: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
9430: 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e  ");.  #endif.#en
9440: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
9450: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
9460: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9470: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
9480: 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d  );..  pVfs = db-
9490: 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c  >pVfs;.  p = sql
94a0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
94b0: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
94c0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
94d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
94e0: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
94f0: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
9500: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
9510: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
9520: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
9530: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
9540: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9550: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
9560: 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
9570: 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
9580: 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
9590: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
95a0: 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
95b0: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
95c0: 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
95d0: 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
95e0: 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26   isMemdb==0.   &
95f0: 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
9600: 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a 20  QLITE_Vtab)==0. 
9610: 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26    && zFilename &
9620: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20  & zFilename[0]. 
9630: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
9640: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e  te3SharedCacheEn
9650: 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69  abled ){.      i
9660: 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
9670: 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
9680: 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
9690: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
96a0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
96b0: 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (nFullPathname);
96c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
96d0: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
96e0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  d;.      p->shar
96f0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
9700: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
9710: 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b  ITE_SharedCache;
9720: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
9730: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
9740: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9750: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
9760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9770: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
9780: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
9790: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
97a0: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
97b0: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
97c0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
97d0: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
97e0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
97f0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
9800: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
9810: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9820: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
9830: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  ;.      for(pBt=
9840: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
9850: 68 65 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74  heList; pBt; pBt
9860: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
9870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
9880: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
9890: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
98a0: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
98b0: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
98c0: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
98d0: 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  er)).           
98e0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
98f0: 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
9900: 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
9910: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
9920: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
9930: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
9940: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9970: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
9980: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
9990: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
99a0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
99b0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
99c0: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
99d0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
99e0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
99f0: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
9a00: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
9a10: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
9a20: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
9a30: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
9a40: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
9a50: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
9a60: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
9a70: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
9a80: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
9a90: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
9aa0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
9ab0: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
9ac0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
9ad0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
9ae0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
9af0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
9b00: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
9b10: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
9b20: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
9b30: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
9b40: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
9b50: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
9b60: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
9b70: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
9b80: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
9b90: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
9ba0: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
9bb0: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
9bc0: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
9bd0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
9be0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
9bf0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
9c00: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
9c10: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
9c20: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
9c30: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
9c40: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
9c50: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
9c60: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
9c70: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
9c80: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
9c90: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
9ca0: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
9cb0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9cc0: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
9cd0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
9ce0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
9cf0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9d00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
9d10: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
9d20: 7d 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48  }.    pBt->busyH
9d30: 64 72 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74  dr.xFunc = sqlit
9d40: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
9d50: 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42  yHandler;.    pB
9d60: 74 2d 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20  t->busyHdr.pArg 
9d70: 3d 20 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20  = pBt;.    rc = 
9d80: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
9d90: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
9da0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
9dd0: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
9de0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
9df0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9e00: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9e10: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
9e20: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
9e30: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
9e40: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
9e50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
9e60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9e70: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
9e80: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
9e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9ea0: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
9eb0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
9ec0: 74 2d 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20  t->busyHdr);.   
9ed0: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
9ee0: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
9ef0: 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28  erSetDestructor(
9f00: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
9f10: 65 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  eDestructor);.  
9f20: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
9f30: 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70  tReiniter(pBt->p
9f40: 50 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69  Pager, pageReini
9f50: 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  t);.    pBt->pCu
9f60: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
9f70: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
9f80: 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
9f90: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49   = sqlite3PagerI
9fa0: 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
9fb0: 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
9fc0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32  >pageSize = get2
9fd0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
9fe0: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42  16]);.    if( pB
9ff0: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
a000: 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
a010: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
a020: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
a030: 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
a040: 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
a050: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
a060: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
a070: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
a080: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
a090: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
a0a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
a0b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a0c0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
a0d0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
a0e0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
a0f0: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
a100: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
a110: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
a120: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
a130: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
a140: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
a150: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
a160: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
a170: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
a180: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
a190: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
a1a0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
a1b0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
a1c0: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
a1d0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
a1e0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
a1f0: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
a200: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
a210: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
a220: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
a230: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
a240: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
a250: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
a260: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
a270: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
a280: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
a290: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
a2a0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
a2b0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
a2c0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
a2d0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
a2e0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
a2f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
a300: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
a310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
a320: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
a330: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
a340: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
a350: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
a360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
a370: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
a380: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
a390: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
a3a0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
a3b0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
a3c0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
a3d0: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
a3e0: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
a3f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
a400: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
a410: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
a420: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
a430: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
a440: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
a450: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
a460: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
a470: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c  eSize */.    sql
a480: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
a490: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
a4a0: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
a4b0: 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  );.   .#if !defi
a4c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a4d0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
a4e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a4f0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
a500: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
a510: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
a520: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
a530: 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
a540: 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
a550: 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
a560: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
a570: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
a580: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42  Shared;.      pB
a590: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
a5a0: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
a5b0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
a5c0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
a5d0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
a5e0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
a5f0: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
a600: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 43 6f  qlite3Config.bCo
a610: 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
a620: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
a630: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a640: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
a650: 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
a660: 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
a670: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
a680: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
a690: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
a6a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
a6b0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
a6c0: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
a6d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a6e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
a6f0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
a700: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
a710: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69  Bt->pNext = sqli
a720: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a730: 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
a740: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
a750: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
a760: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a770: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
a780: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
a790: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a7a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a7b0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
a7c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a7d0: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
a7e0: 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
a7f0: 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
a800: 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
a810: 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
a820: 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
a830: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
a840: 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
a850: 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
a860: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
a870: 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
a880: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
a890: 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
a8a0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
a8b0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
a8c0: 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
a8d0: 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
a8e0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a8f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
a900: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
a910: 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
a920: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
a930: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
a940: 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
a950: 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
a960: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
a970: 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
a980: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
a990: 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
a9a0: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
a9b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
a9c0: 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
a9d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a9e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
a9f0: 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
aa00: 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
aa10: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
aa20: 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
aa30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
aa40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
aa50: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
aa60: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
aa70: 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
aa80: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
aa90: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
aaa0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
aab0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
aac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aad0: 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
aae0: 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
aaf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ab00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
ab10: 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
ab20: 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
ab30: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
ab40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ab50: 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
ab60: 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
ab70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
ab80: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
ab90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
aba0: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
abb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
abc0: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
abd0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
abe0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
abf0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
ac00: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
ac10: 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
ac20: 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
ac30: 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
ac40: 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
ac50: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
ac60: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
ac70: 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
ac80: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
ac90: 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
aca0: 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
acb0: 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
acc0: 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
acd0: 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
ace0: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
acf0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
ad00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad10: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
ad20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
ad30: 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61  pMaster;.  BtSha
ad40: 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
ad50: 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
ad60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ad70: 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
ad80: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ad90: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
ada0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
adb0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
adc0: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
add0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ade0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
adf0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
ae00: 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
ae10: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 68     if( sqlite3Sh
ae20: 61 72 65 64 43 61 63 68 65 4c 69 73 74 3d 3d 70  aredCacheList==p
ae30: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
ae40: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
ae50: 73 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  st = pBt->pNext;
ae60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ae70: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
ae80: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
ae90: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
aea0: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
aeb0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
aec0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
aed0: 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
aee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
aef0: 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
af00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
af10: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
af20: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
af30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
af40: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
af50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
af60: 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
af70: 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
af80: 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
af90: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
afa0: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
afb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
afc0: 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
afd0: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
afe0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
aff0: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
b000: 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
b010: 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
b020: 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
b030: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
b040: 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
b050: 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
b060: 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
b070: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
b080: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
b090: 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
b0a0: 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
b0b0: 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d  ageSize );.  }.}
b0c0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
b0d0: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
b0e0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
b0f0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
b100: 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
b110: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
b120: 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e  3PageFree( pBt->
b130: 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42  pTmpSpace);.  pB
b140: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
b150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
b160: 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
b170: 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
b180: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
b190: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
b1a0: 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
b1b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b1c0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
b1d0: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
b1e0: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
b1f0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
b200: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
b210: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
b220: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b230: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
b240: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
b250: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
b260: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75  b = p->db;.  pCu
b270: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
b280: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
b290: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
b2a0: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
b2b0: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
b2c0: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
b2d0: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
b2e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
b2f0: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
b300: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
b310: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
b320: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
b330: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
b340: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
b350: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
b360: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
b370: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
b380: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
b390: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
b3a0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
b3b0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
b3c0: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
b3d0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
b3e0: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
b3f0: 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
b400: 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
b410: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
b420: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
b430: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
b440: 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
b450: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
b460: 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
b470: 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
b480: 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
b490: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
b4a0: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
b4b0: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
b4c0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
b4d0: 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
b4e0: 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
b4f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
b500: 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
b510: 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
b520: 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
b530: 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
b540: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
b550: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
b560: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
b570: 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
b580: 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
b590: 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
b5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
b5b0: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
b5c0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
b5d0: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
b5e0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
b5f0: 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
b600: 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
b610: 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
b620: 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
b630: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
b640: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e  lite3_free(pBt->
b650: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
b660: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
b670: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
b680: 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
b690: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6a0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
b6b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
b6c0: 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
b6d0: 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
b6e0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
b6f0: 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
b700: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
b710: 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
b720: 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
b730: 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
b740: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
b750: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
b760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b770: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
b780: 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
b790: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
b7a0: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
b7b0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
b7c0: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
b7d0: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
b7e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
b7f0: 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
b800: 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
b810: 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
b820: 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
b830: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
b840: 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
b850: 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
b860: 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
b870: 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
b880: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
b890: 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
b8a0: 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
b8b0: 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
b8c0: 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
b8d0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
b8e0: 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
b8f0: 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
b900: 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
b910: 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
b920: 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
b930: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
b940: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
b950: 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
b960: 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
b970: 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
b980: 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
b990: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
b9a0: 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
b9b0: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
b9c0: 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
b9d0: 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
b9e0: 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
b9f0: 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
ba00: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
ba10: 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
ba20: 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
ba30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
ba40: 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
ba50: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
ba60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ba70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
ba80: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ba90: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
baa0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
bab0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
bac0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
bad0: 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
bae0: 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
baf0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bb00: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
bb10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
bb20: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
bb30: 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
bb40: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
bb50: 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
bb60: 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
bb70: 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
bb80: 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
bb90: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
bba0: 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
bbb0: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
bbc0: 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
bbd0: 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
bbe0: 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
bbf0: 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
bc00: 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
bc10: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
bc20: 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
bc30: 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
bc40: 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
bc50: 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
bc60: 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
bc70: 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
bc80: 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
bc90: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
bca0: 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
bcb0: 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
bcc0: 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
bcd0: 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
bce0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bcf0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
bd00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
bd10: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
bd20: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65  Btree *p, int le
bd30: 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e  vel, int fullSyn
bd40: 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  c){.  BtShared *
bd50: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
bd60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
bd70: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
bd80: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
bd90: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
bda0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
bdb0: 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
bdc0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
bdd0: 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a  vel, fullSync);.
bde0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
bdf0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
be00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
be10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
be20: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
be30: 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65  iven btree is se
be40: 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65  t to safety leve
be50: 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a  l 1.  In other.*
be60: 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  * words, return 
be70: 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28  TRUE if no sync(
be80: 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  ) occurs on the 
be90: 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  disk files..*/.i
bea0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
beb0: 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65  yncDisabled(Btre
bec0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
bed0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
bee0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
bef0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bf00: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
bf10: 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c  utex) );  .  sql
bf20: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
bf30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
bf40: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
bf50: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
bf60: 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74  3PagerNosync(pBt
bf70: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  ->pPager);.  sql
bf80: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
bf90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bfa0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
bfb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
bfc0: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
bfd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bfe0: 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
bff0: 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
c000: 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
c010: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
c020: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
c030: 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  per page..**.** 
c040: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
c050: 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
c060: 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
c070: 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
c080: 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
c090: 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
c0a0: 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
c0b0: 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
c0c0: 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
c0d0: 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
c0e0: 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
c0f0: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
c100: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
c110: 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
c120: 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
c130: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
c140: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
c150: 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
c160: 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
c170: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
c180: 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
c190: 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
c1a0: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
c1b0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
c1c0: 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
c1d0: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
c1e0: 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
c1f0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
c200: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c210: 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
c220: 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
c230: 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  t unchanged..*/.
c240: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c250: 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
c260: 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
c270: 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
c280: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c290: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
c2a0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
c2b0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
c2c0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
c2d0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
c2e0: 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
c2f0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c300: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c310: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
c320: 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
c330: 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
c340: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
c350: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
c360: 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ize;.  }.  if( p
c370: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
c380: 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
c390: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
c3a0: 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
c3b0: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
c3c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
c3d0: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
c3e0: 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
c3f0: 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65  ert( !pBt->pPage
c400: 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73  1 && !pBt->pCurs
c410: 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
c420: 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
c430: 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
c440: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
c450: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
c460: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
c470: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
c480: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  pageSize);.  }. 
c490: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c4a0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
c4b0: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73   - nReserve;.  s
c4c0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c4d0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c4e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c4f0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
c500: 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
c510: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
c520: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
c530: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
c540: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
c550: 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  eSize;.}.int sql
c560: 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
c570: 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
c580: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
c590: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c5a0: 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
c5b0: 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
c5c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73  >usableSize;.  s
c5d0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c5e0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
c5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c600: 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
c610: 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
c620: 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
c630: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
c640: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
c650: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
c660: 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
c670: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
c680: 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
c690: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
c6a0: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
c6b0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
c6c0: 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
c6d0: 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
c6e0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
c6f0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
c700: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
c710: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
c720: 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
c730: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
c740: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
c750: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c760: 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn n;.}.#endif 
c770: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
c780: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
c790: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
c7a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
c7b0: 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
c7c0: 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
c7d0: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
c7e0: 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
c7f0: 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
c800: 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
c810: 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
c820: 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
c830: 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
c840: 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
c850: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
c860: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
c870: 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
c880: 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
c890: 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
c8a0: 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
c8b0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
c8c0: 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
c8d0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
c8e0: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
c8f0: 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
c900: 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
c910: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c920: 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
c930: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
c940: 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
c950: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
c960: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c970: 4b 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61  K;.  int av = (a
c980: 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a  utoVacuum?1:0);.
c990: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
c9a0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
c9b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
c9c0: 64 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75  d && av!=pBt->au
c9d0: 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
c9e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
c9f0: 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
ca00: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
ca10: 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73  um = av;.  }.  s
ca20: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
ca30: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
ca40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ca50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
ca60: 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
ca70: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
ca80: 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
ca90: 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
caa0: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
cab0: 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
cac0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
cad0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
cae0: 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
caf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
cb00: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
cb10: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
cb20: 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
cb30: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
cb40: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
cb50: 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
cb60: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
cb70: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
cb80: 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
cb90: 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
cba0: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
cbb0: 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
cbc0: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
cbd0: 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
cbe0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
cbf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
cc00: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
cc10: 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
cc20: 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
cc30: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
cc40: 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
cc50: 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
cc60: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
cc70: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
cc80: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
cc90: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
cca0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
ccb0: 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
ccc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
ccd0: 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
cce0: 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
ccf0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
cd00: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
cd10: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
cd20: 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
cd30: 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
cd40: 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
cd50: 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
cd60: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
cd70: 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
cd80: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
cd90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
cda0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20  .  int nPage;.. 
cdb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cdc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
cdd0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
cde0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72   pBt->pPage1 ) r
cdf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ce00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
ce10: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
ce20: 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
ce30: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ce40: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
ce50: 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
ce60: 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
ce70: 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
ce80: 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
ce90: 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
cea0: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
ceb0: 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71   .  */.  rc = sq
cec0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
ced0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
cee0: 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
cef0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cf00: 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f  .    goto page1_
cf10: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  init_failed;.  }
cf20: 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30  else if( nPage>0
cf30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65   ){.    int page
cf40: 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73  Size;.    int us
cf50: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
cf60: 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
cf70: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
cf80: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
cf90: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
cfa0: 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
cfb0: 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
cfc0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
cfd0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
cfe0: 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
cff0: 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
d000: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
d010: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
d020: 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
d030: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d040: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d050: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
d060: 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
d070: 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
d080: 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
d090: 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
d0a0: 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
d0b0: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
d0c0: 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
d0d0: 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
d0e0: 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
d0f0: 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
d100: 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
d110: 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
d120: 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
d130: 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
d140: 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
d150: 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
d160: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
d170: 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
d180: 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
d190: 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
d1a0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d1b0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d1c0: 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
d1d0: 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
d1e0: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
d1f0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
d200: 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67  eSize)!=0 || pag
d210: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20  eSize<512 ||.   
d220: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58       (SQLITE_MAX
d230: 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38  _PAGE_SIZE<32768
d240: 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   && pageSize>SQL
d250: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
d260: 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  E).    ){.      
d270: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
d280: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
d290: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
d2a0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
d2b0: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
d2c0: 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
d2d0: 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61  [20];.    if( pa
d2e0: 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
d2f0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
d300: 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
d310: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
d320: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
d330: 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
d340: 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
d350: 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
d360: 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
d370: 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
d380: 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
d390: 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
d3a0: 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
d3b0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
d3c0: 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
d3d0: 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
d3e0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d3f0: 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
d400: 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
d410: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
d420: 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
d430: 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
d440: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
d450: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
d460: 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
d470: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
d480: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
d490: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
d4a0: 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
d4b0: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
d4c0: 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pBt);.      sqli
d4d0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
d4e0: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
d4f0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
d500: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
d510: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
d520: 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
d530: 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20  ze<500 ){.      
d540: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
d550: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
d560: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
d570: 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
d580: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
d590: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
d5a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d5b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
d5c0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
d5d0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
d5e0: 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
d5f0: 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
d600: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
d610: 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
d620: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
d630: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
d640: 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
d650: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
d660: 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
d670: 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
d680: 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
d690: 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
d6a0: 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
d6b0: 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
d6c0: 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
d6d0: 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
d6e0: 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
d6f0: 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
d700: 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
d710: 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
d720: 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
d730: 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
d740: 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
d750: 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
d760: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
d770: 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
d780: 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
d790: 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
d7a0: 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
d7b0: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
d7c0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
d7d0: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
d7e0: 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
d7f0: 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
d800: 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
d810: 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
d820: 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
d830: 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
d840: 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
d850: 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
d860: 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
d870: 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
d880: 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
d890: 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
d8a0: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
d8b0: 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
d8c0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
d8d0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
d8e0: 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
d8f0: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70  pBt->maxLeaf = p
d900: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
d910: 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   35;.  pBt->minL
d920: 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  eaf = (pBt->usab
d930: 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
d940: 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74  5 - 23;.  assert
d950: 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
d960: 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
d970: 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
d980: 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
d990: 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
d9a0: 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
d9b0: 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
d9c0: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
d9d0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
d9e0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
d9f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
da00: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
da10: 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ike lockBtree() 
da20: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61  except that it a
da30: 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  lso invokes the.
da40: 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ** busy callback
da50: 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63   if there is loc
da60: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f  k contention..*/
da70: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
da80: 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42  BtreeWithRetry(B
da90: 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69  tree *pRef){.  i
daa0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dab0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
dac0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
dad0: 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20  utex(pRef) );.  
dae0: 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e  if( pRef->inTran
daf0: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
db00: 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61  .    u8 inTransa
db10: 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42  ction = pRef->pB
db20: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
db30: 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  ;.    btreeInteg
db40: 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20  rity(pRef);.    
db50: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
db60: 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66  eBeginTrans(pRef
db70: 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e  , 0);.    pRef->
db80: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
db90: 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69  on = inTransacti
dba0: 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e  on;.    pRef->in
dbb0: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
dbc0: 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  NE;.    if( rc==
dbd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dbe0: 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54     pRef->pBt->nT
dbf0: 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
dc00: 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74    }.    btreeInt
dc10: 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
dc20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
dc30: 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  .       ../*.** 
dc40: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
dc50: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
dc60: 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
dc70: 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
dc80: 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
dc90: 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
dca0: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
dcb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
dcc0: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
dcd0: 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
dce0: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
dcf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
dd00: 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
dd10: 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
dd20: 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
dd30: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
dd40: 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74  re are any outst
dd50: 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20  anding cursors, 
dd60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
dd70: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
dd80: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
dd90: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
dda0: 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
ddb0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
ddc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
ddd0: 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
dde0: 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
ddf0: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
de00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
de10: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
de20: 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
de30: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
de40: 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73  NE && pBt->pCurs
de50: 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50  or==0 && pBt->pP
de60: 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69  age1!=0 ){.    i
de70: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f( sqlite3PagerR
de80: 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
de90: 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20  ger)>=1 ){.     
dea0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
deb0: 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23  age1->aData );.#
dec0: 69 66 20 30 0a 20 20 20 20 20 20 69 66 28 20 70  if 0.      if( p
ded0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
dee0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
def0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
df00: 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
df10: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61        pPage->aDa
df20: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
df30: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
df40: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
df50: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
df60: 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  Bt;.        pPag
df70: 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  e->pgno = 1;.   
df80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
df90: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
dfa0: 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
dfb0: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  }.    pBt->pPage
dfc0: 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  1 = 0;.    pBt->
dfd0: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
dfe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
dff0: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62  a new database b
e000: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
e010: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
e020: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f   the.** file..*/
e030: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
e040: 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
e050: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
e060: 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
e070: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
e080: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
e090: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
e0a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e0b0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
e0c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
e0d0: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
e0e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
e0f0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
e100: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61  SQLITE_OK || nPa
e110: 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
e120: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31  rn rc;.  }.  pP1
e130: 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
e140: 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
e150: 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
e160: 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
e170: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
e180: 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
e190: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
e1a0: 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
e1b0: 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
e1c0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
e1d0: 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
e1e0: 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
e1f0: 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
e200: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
e210: 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65  a[16], pBt->page
e220: 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38  Size);.  data[18
e230: 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
e240: 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30  ] = 1;.  data[20
e250: 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ] = pBt->pageSiz
e260: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
e270: 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ize;.  data[21] 
e280: 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
e290: 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
e2a0: 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
e2b0: 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
e2c0: 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
e2d0: 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
e2e0: 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
e2f0: 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
e300: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
e310: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
e320: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e330: 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
e340: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
e350: 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
e360: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
e370: 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
e380: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
e390: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
e3a0: 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
e3b0: 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
e3c0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
e3d0: 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
e3e0: 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
e3f0: 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
e400: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
e410: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e420: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
e430: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
e440: 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
e450: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
e460: 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
e470: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
e480: 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
e490: 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
e4a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
e4b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
e4c0: 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
e4d0: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
e4e0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
e4f0: 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
e500: 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
e510: 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
e520: 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
e530: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
e540: 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
e550: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
e560: 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
e570: 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
e580: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
e590: 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
e5a0: 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
e5b0: 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
e5c0: 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
e5d0: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
e5e0: 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
e5f0: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
e600: 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
e610: 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
e620: 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
e630: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
e640: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
e650: 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
e660: 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
e670: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
e680: 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
e690: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
e6a0: 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
e6b0: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
e6c0: 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
e6d0: 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
e6e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
e6f0: 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
e700: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
e710: 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
e720: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
e730: 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
e740: 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
e750: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e760: 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
e770: 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
e780: 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
e790: 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
e7a0: 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
e7b0: 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
e7c0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
e7d0: 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
e7e0: 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
e7f0: 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
e800: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
e810: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
e820: 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
e830: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
e840: 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
e850: 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
e860: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
e870: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
e880: 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
e890: 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
e8a0: 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
e8b0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
e8c0: 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
e8d0: 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
e8e0: 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
e8f0: 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
e900: 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
e910: 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
e920: 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
e930: 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
e940: 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
e950: 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
e960: 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
e970: 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
e980: 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
e990: 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
e9a0: 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
e9b0: 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
e9c0: 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
e9d0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
e9e0: 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
e9f0: 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
ea00: 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
ea10: 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
ea20: 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
ea30: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
ea40: 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
ea50: 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
ea60: 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
ea70: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
ea80: 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
ea90: 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
eaa0: 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
eab0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
eac0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
ead0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
eae0: 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ag){.  BtShared 
eaf0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
eb00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
eb10: 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
eb20: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
eb30: 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
eb40: 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
eb50: 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
eb60: 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
eb70: 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
eb80: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
eb90: 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
eba0: 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
ebb0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
ebc0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
ebd0: 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
ebe0: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
ebf0: 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
ec00: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
ec10: 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
ec20: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
ec30: 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
ec40: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
ec50: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  egun;.  }..  /* 
ec60: 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
ec70: 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
ec80: 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
ec90: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
eca0: 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
ecb0: 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  ly && wrflag ){.
ecc0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ecd0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
ece0: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
ecf0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f    }..  /* If ano
ed00: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
ed10: 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
ed20: 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
ed30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
ed40: 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
ed50: 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
ed60: 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
ed70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
ed80: 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
ed90: 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
eda0: 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  _BUSY..  */.  if
edb0: 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
edc0: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
edd0: 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  E && wrflag ){. 
ede0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
edf0: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  USY;.    goto tr
ee00: 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
ee10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ee20: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ee30: 0a 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  .  if( wrflag>1 
ee40: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
ee50: 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
ee60: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
ee70: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
ee80: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
ee90: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
eea0: 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
eeb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
eec0: 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SY;.        goto
eed0: 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
eee0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
eef0: 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20  #endif..  do {. 
ef00: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67     if( pBt->pPag
ef10: 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  e1==0 ){.      d
ef20: 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o{.        rc = 
ef30: 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a  lockBtree(pBt);.
ef40: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 42        }while( pB
ef50: 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
ef60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
ef70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
ef80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ef90: 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
efa0: 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
efb0: 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
efc0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
efd0: 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
efe0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
eff0: 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
f000: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
f010: 50 61 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b  Page, wrflag>1);
f020: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
f030: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f040: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
f050: 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
f060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f070: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
f080: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f090: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  ){.      if( wrf
f0a0: 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d  lag ) pBt->inStm
f0b0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
f0c0: 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
f0d0: 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
f0e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
f0f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
f100: 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
f110: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
f120: 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
f130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76   sqlite3BtreeInv
f140: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
f150: 42 74 2c 20 30 29 20 29 3b 0a 0a 20 20 69 66 28  Bt, 0) );..  if(
f160: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f170: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
f180: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
f190: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
f1a0: 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20  Transaction++;. 
f1b0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
f1c0: 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
f1d0: 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
f1e0: 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
f1f0: 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
f200: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
f210: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
f220: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
f230: 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66  Trans;.    }.#if
f240: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f250: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
f260: 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
f270: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
f280: 21 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65  !pBt->pExclusive
f290: 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
f2a0: 45 78 63 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20  Exclusive = p;. 
f2b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
f2c0: 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
f2d0: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
f2e0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
f2f0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f300: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
f310: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f320: 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
f330: 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
f340: 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
f350: 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
f360: 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
f370: 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
f380: 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
f390: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
f3a0: 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
f3b0: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
f3c0: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
f3d0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
f3e0: 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
f3f0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
f400: 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
f410: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
f420: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
f450: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
f460: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
f470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f480: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
f490: 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
f4a0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4c0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f4d0: 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
f4e0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
f4f0: 70 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69  pBt;.  int isIni
f500: 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
f510: 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
f520: 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
f530: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
f540: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f550: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f560: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
f570: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
f580: 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
f590: 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
f5a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f5b0: 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
f5c0: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
f5d0: 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
f5e0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
f5f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
f600: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
f610: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
f620: 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
f630: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
f640: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
f650: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
f660: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f670: 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
f680: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
f690: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
f6a0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
f6b0: 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
f6c0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
f6d0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
f6e0: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
f6f0: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
f700: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
f710: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
f720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
f730: 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
f740: 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  aps_out;.    }. 
f750: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
f760: 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
f770: 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
f780: 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
f790: 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
f7a0: 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
f7b0: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
f7c0: 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
f7d0: 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
f7e0: 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  o);.  }..set_chi
f7f0: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
f800: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
f810: 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
f820: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f830: 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
f840: 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73   pPage, which is
f850: 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
f860: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20  e a btree page, 
f870: 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a  not an overflow.
f880: 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f  ** page, is a po
f890: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
f8a0: 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73  rom. Modify this
f8b0: 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74   pointer so that
f8c0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
f8d0: 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
f8e0: 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
f8f0: 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
f900: 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  ter to be modifi
f910: 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f  ed, as .** follo
f920: 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
f930: 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
f940: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
f950: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
f960: 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
f970: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
f980: 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
f990: 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
f9a0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
f9b0: 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
f9c0: 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
f9d0: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
f9e0: 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
fa00: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
fa10: 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
fa20: 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
fa30: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
fa40: 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
fa50: 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
fa60: 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
fa70: 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
faa0: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
fab0: 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
fac0: 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
fad0: 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
fae0: 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
faf0: 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
fb00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fb10: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
fb20: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
fb30: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
fb40: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
fb50: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
fb60: 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
fb70: 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
fb80: 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
fb90: 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
fba0: 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
fbb0: 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
fbc0: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
fbd0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fbe0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
fbf0: 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
fc00: 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
fc10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
fc20: 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
fc30: 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
fc40: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
fc50: 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69  nCell;..    sqli
fc60: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
fc70: 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
fc80: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
fc90: 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
fca0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
fcb0: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
fcc0: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
fcd0: 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
fce0: 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
fcf0: 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
fd00: 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
fd10: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nfo;.        sql
fd20: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
fd30: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
fd40: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
fd50: 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
fd60: 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
fd70: 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
fd80: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
fd90: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
fda0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
fdb0: 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
fdc0: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
fdd0: 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
fde0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
fdf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
fe00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fe10: 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
fe20: 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
fe30: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
fe40: 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
fe50: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
fe60: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
fe70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
fe80: 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
fe90: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
fea0: 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
feb0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
fec0: 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
fed0: 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
fee0: 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
fef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ff00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ff10: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
ff20: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
ff30: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
ff40: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
ff50: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
ff60: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
ff70: 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
ff80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
ff90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
ffa0: 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
ffb0: 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
ffc0: 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
ffd0: 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
ffe0: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
fff0: 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
10000 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
10010 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
10020 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
10030 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10040 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
10050 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
10060 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
10070 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
10080 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
10090 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
100a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
100b0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
100c0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
100d0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
100e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
100f0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
10100 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
10110 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
10120 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
10130 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
10140 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
10150 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
10160 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d   isCommit.){.  M
10170 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
10180 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
10190 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
101a0 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
101b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
101c0 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
101d0 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
101e0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
101f0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
10200 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
10210 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
10220 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
10230 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
10240 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
10250 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
10260 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
10270 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
10280 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10290 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
102a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
102b0 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
102c0 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
102d0 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
102e0 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
102f0 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
10300 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
10310 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
10320 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
10330 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
10340 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
10350 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
10360 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
10370 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
10380 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
10390 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
103a0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
103b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
103c0 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
103d0 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
103e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
103f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10400 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
10410 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
10420 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
10430 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
10440 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
10450 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
10460 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
10470 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
10480 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
10490 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
104a0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
104b0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
104c0 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
104d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
104e0 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
104f0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
10500 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
10510 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
10520 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
10530 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
10540 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
10550 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
10560 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
10570 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
10580 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
10590 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
105a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
105b0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
105c0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
105d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
105e0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
105f0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
10600 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
10610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
10630 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
10640 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
10650 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
10660 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
10670 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
10680 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
10690 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
106a0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
106b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
106c0 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
106d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
106e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
106f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10700 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10710 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
10720 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
10730 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
10740 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
10750 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
10760 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
10770 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
10780 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
10790 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
107a0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
107b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
107c0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
107d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
107e0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
107f0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
10800 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
10810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
10830 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
10840 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10850 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
10860 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
10870 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10880 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
10890 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
108a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
108b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
108c0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
108d0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
108e0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
108f0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
10900 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
10910 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
10920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10930 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
10940 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
10950 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
10960 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
10970 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
10980 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
10990 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
109a0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
109b0 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
109c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
109d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
109e0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
109f0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
10a00 54 45 5f 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b  TE_OK?nPage:-1);
10a10 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
10a20 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
10a30 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
10a40 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
10a50 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
10a60 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
10a70 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
10a80 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
10a90 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
10aa0 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
10ab0 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
10ac0 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
10ad0 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74  ccessful,.** ret
10ae0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
10af0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
10b00 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
10b10 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f  erefore no.** po
10b20 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74  int in calling t
10b30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
10b40 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
10b50 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d  TE_DONE..**.** M
10b60 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
10b70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
10b80 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
10b90 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61  anize the .** da
10ba0 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
10bb0 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
10bc0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
10bd0 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20  ly in use.** is 
10be0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
10bf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
10c00 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  Fin parameter is
10c10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69   non-zero, the i
10c20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73  mplementation as
10c30 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  sumes.** that th
10c40 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  e caller will ke
10c50 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
10c60 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
10c70 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20  l.** it returns 
10c80 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
10c90 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61  n error, and tha
10ca0 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a  t nFin is the.**
10cb0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10cd0 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  le will contain 
10ce0 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70  after this .** p
10cf0 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65  rocess is comple
10d00 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
10d10 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
10d20 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
10d30 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67  Pgno nFin){.  Pg
10d40 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20  no iLastPg;     
10d50 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
10d60 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
10d70 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  base */.  Pgno n
10d80 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
10d90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10da0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
10db0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
10dc0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10dd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10de0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10df0 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e  iLastPg = pBt->n
10e00 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61  Trunc;.  if( iLa
10e10 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  stPg==0 ){.    i
10e20 4c 61 73 74 50 67 20 3d 20 70 61 67 65 72 50 61  LastPg = pagerPa
10e30 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
10e40 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
10e50 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
10e60 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
10e70 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
10e80 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
10e90 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
10ea0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
10eb0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
10ec0 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
10ed0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
10ee0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
10ef0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
10f00 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69  eeList==0 || nFi
10f10 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20  n==iLastPg ){.  
10f20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10f30 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
10f40 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
10f50 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
10f60 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
10f70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
10f80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10f90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10fa0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
10fb0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
10fc0 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
10fd0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10fe0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
10ff0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
11000 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
11010 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
11020 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
11030 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
11040 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
11050 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
11060 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
11070 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
11080 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
11090 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
110a0 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
110b0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
110c0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
110d0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
110e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
110f0 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
11100 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
11110 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
11120 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
11130 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
11140 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
11150 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
11160 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
11170 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
11180 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
11190 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
111a0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
111b0 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
111c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
111d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
111e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
111f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
11200 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
11210 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
11220 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
11230 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
11240 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
11250 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11270 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
11280 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
11290 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
112a0 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
112b0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
112c0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
112d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
112e0 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
112f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11320 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
11330 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
11340 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
11350 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
11360 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
11370 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
11380 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
11390 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
113a0 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
113b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
113c0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
113d0 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
113e0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
113f0 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
11400 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
11410 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
11420 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
11430 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
11440 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
11450 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
11460 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
11470 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
11480 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
11490 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
114a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
114b0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
114c0 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
114d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
114e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
114f0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
11500 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
11510 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11520 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11530 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
11540 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
11550 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
11560 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
11570 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
11580 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
11590 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
115a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
115b0 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
115c0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
115d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
115e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
115f0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
11600 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
11610 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
11620 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d   iFreePg, nFin!=
11630 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
11640 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
11650 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
11660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11670 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11680 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
11690 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d 3e    }.  }..  pBt->
116a0 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50 67  nTrunc = iLastPg
116b0 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70   - 1;.  while( p
116c0 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e 44  Bt->nTrunc==PEND
116d0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
116e0 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47  t)||PTRMAP_ISPAG
116f0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72 75  E(pBt, pBt->nTru
11700 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  nc) ){.    pBt->
11710 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20  nTrunc--;.  }.  
11720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
11740 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
11750 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
11760 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
11770 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
11780 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
11790 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
117a0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
117b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
117c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
117d0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
117e0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
117f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
11800 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
11810 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
11820 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
11830 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
11840 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  no error occured
11850 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
11860 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
11870 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
11880 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
11890 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
118a0 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
118b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
118c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
118d0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
118e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
118f0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
11900 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
11910 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
11920 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
11930 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
11940 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
11950 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
11960 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
11970 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
11980 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c  }else{.    inval
11990 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
119a0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
119b0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
119c0 74 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d  tep(pBt, 0);.  }
119d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
119e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
119f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11a00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11a10 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
11a20 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
11a30 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
11a40 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
11a50 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
11a60 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
11a70 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
11a80 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
11a90 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
11aa0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
11ab0 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
11ac0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11ad0 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
11ae0 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
11af0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
11b00 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
11b10 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
11b20 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
11b30 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
11b40 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
11b50 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
11b60 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
11b70 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
11b80 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
11b90 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29  , Pgno *pnTrunc)
11ba0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11bb0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
11bc0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
11bd0 50 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e  Pager;.#ifndef N
11be0 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66  DEBUG.  int nRef
11bf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
11c00 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  efcount(pPager);
11c10 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
11c20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11c30 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11c40 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
11c50 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
11c60 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
11c70 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
11c80 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
11c90 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
11ca0 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a   Pgno nFin = 0;.
11cb0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  .    if( pBt->nT
11cc0 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  runc==0 ){.     
11cd0 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20   Pgno nFree;.   
11ce0 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b     Pgno nPtrmap;
11cf0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
11d00 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67   pgsz = pBt->pag
11d10 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 6e 74  eSize;.      int
11d20 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61   nOrig = pagerPa
11d30 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
11d40 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ger);..      if(
11d50 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
11d60 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20  Bt, nOrig) ){.  
11d70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11d80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11da0 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49  if( nOrig==PENDI
11db0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
11dc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72  ) ){.        nOr
11dd0 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ig--;.      }.  
11de0 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
11df0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
11e00 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
11e10 20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28       nPtrmap = (
11e20 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
11e30 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
11e40 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70  Orig)+pgsz/5)/(p
11e50 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46  gsz/5);.      nF
11e60 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
11e70 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
11e80 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
11e90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11ea0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45  pBt) && nFin<=PE
11eb0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11ec0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
11ed0 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nFin--;.      }.
11ee0 20 20 20 20 20 20 77 68 69 6c 65 28 20 50 54 52        while( PTR
11ef0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
11f00 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
11f10 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
11f20 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
11f30 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d   nFin--;.      }
11f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
11f50 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
11f60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   ){.      rc = i
11f70 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
11f80 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a  t, nFin);.    }.
11f90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11fa0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
11fb0 20 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20   assert(nFin==0 
11fc0 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d  || pBt->nTrunc==
11fd0 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e  0 || nFin<=pBt->
11fe0 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72  nTrunc);.      r
11ff0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12000 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54       if( pBt->nT
12010 72 75 6e 63 20 26 26 20 6e 46 69 6e 20 29 7b 0a  runc && nFin ){.
12020 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12030 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
12040 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
12050 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
12060 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
12070 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
12080 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  0);.        put4
12090 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
120a0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
120b0 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
120c0 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20  Trunc = nFin;.  
120d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
120e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
120f0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
12100 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
12110 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
12120 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
12130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
12140 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e  pnTrunc = pBt->n
12150 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e  Trunc;.    pBt->
12160 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  nTrunc = 0;.  }.
12170 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
12180 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
12190 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
121a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
121b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
121c0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
121d0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
121e0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
121f0 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
12200 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
12210 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12220 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
12230 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
12240 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
12250 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
12260 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
12270 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
12280 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
12290 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
122a0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
122b0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
122c0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
122d0 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
122e0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
122f0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
12300 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
12310 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
12320 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
12330 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
12340 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
12350 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
12360 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
12370 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
12380 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
12390 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
123a0 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
123b0 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
123c0 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
123d0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
123e0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
123f0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
12400 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
12410 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
12420 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
12430 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
12440 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
12450 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
12460 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
12470 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
12480 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
12490 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
124a0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
124b0 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
124c0 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
124d0 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
124e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
124f0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
12500 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
12510 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
12520 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
12530 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
12540 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12550 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
12560 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
12570 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
12580 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
12590 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
125a0 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
125b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
125c0 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
125d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
125e0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
125f0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
12600 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
12610 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
12620 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
12630 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
12640 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
12650 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
12660 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
12670 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
12680 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
12690 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
126a0 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
126b0 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
126c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
126d0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
126e0 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
126f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
12700 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12710 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
12720 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
12730 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
12740 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12750 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
12760 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
12770 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
12780 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12790 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72  Bt;.    Pgno nTr
127a0 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  unc = 0;.    sql
127b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
127c0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  );.    pBt->db =
127d0 20 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20   p->db;.#ifndef 
127e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
127f0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
12800 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
12810 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
12820 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
12830 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20  t, &nTrunc); .  
12840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12860 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12870 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
12880 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12890 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
128a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
128b0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
128c0 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
128d0 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 2c  zMaster, nTrunc,
128e0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
128f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12900 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12910 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
12920 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12930 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
12940 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
12950 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
12960 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
12970 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
12980 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
12990 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  ** sqlite3BtreeS
129a0 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  ync() routine do
129b0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
129c0 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  se and should be
129d0 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f   invoked.** prio
129e0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
129f0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
12a00 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
12a10 28 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a  () routine did.*
12a20 2a 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  * all the work o
12a30 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
12a40 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
12a50 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
12a60 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
12a70 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
12a80 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
12a90 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
12aa0 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
12ab0 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
12ac0 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
12ad0 61 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ate the rollback
12ae0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69   journal.** (whi
12af0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
12b00 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
12b10 6d 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f  mit) and drop lo
12b20 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
12b30 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
12b40 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
12b50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12b60 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
12b70 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
12b80 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
12b90 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
12ba0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
12bb0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12bc0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
12bd0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12be0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
12bf0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12c00 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
12c10 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65  = p->db;.  btree
12c20 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
12c30 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
12c40 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
12c50 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
12c60 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
12c70 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
12c80 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
12c90 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
12ca0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
12cb0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
12cc0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
12cd0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
12ce0 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
12cf0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
12d00 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
12d10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12d20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
12d30 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
12d40 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
12d50 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
12d60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
12d70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12d80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
12d90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12da0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12db0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
12dc0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
12dd0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42  ANS_READ;.    pB
12de0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
12df0 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   }.  unlockAllTa
12e00 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  bles(p);..  /* I
12e10 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
12e20 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
12e30 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
12e40 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61  ecrement the tra
12e50 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
12e60 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
12e70 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
12e80 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
12e90 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  t reaches 0, set
12ea0 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64  .  ** the shared
12eb0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
12ec0 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
12ed0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20  BtreeIfUnused() 
12ee0 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20  call below.  ** 
12ef0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
12f00 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  pager..  */.  if
12f10 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
12f20 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
12f30 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
12f40 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
12f50 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
12f60 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
12f70 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
12f80 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
12f90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
12fa0 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72  the handles curr
12fb0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12fc0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
12fd0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20  ONE and unlock. 
12fe0 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66   ** the pager if
12ff0 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
13000 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
13010 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
13020 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  tion..  */.  p->
13030 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
13040 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
13050 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
13060 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
13070 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
13080 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
130a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
130b0 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
130c0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
130d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
130e0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
130f0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
13100 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
13120 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
13130 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
13140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13160 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
13170 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71  Two(p);.  }.  sq
13180 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13190 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
131a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
131b0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
131c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
131d0 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
131e0 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
131f0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
13200 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
13210 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
13220 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
13230 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
13240 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
13250 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
13260 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
13270 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65  routine, a write
13280 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63  -cursor is any c
13290 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
132a0 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74   capable of writ
132b0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
132c0 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  se.  That means 
132d0 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a  the cursor was.*
132e0 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  * originally ope
132f0 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
13300 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68  and the cursor h
13310 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c  as not be disabl
13320 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20  ed.** by having 
13330 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65  its state change
13340 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  d to CURSOR_FAUL
13350 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
13360 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
13370 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
13380 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
13390 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
133a0 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
133b0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
133c0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
133d0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
133e0 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72  ->wrFlag && pCur
133f0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
13400 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
13410 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
13420 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
13430 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
13440 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
13450 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
13460 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
13470 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
13480 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
13490 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
134a0 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
134b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
134c0 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
134d0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
134e0 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
134f0 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
13500 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13510 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
13520 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
13530 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
13540 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
13550 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
13560 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
13570 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
13580 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
13590 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
135a0 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
135b0 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
135c0 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
135d0 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
135e0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
135f0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
13600 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
13610 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
13620 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
13630 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
13640 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
13650 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
13660 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
13670 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
13680 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
13690 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
136a0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
136b0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
136c0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
136d0 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
136e0 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
136f0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
13700 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
13710 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
13720 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
13730 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
13740 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
13750 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
13760 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
13770 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b  >skip = errCode;
13780 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
13790 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
137a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
137b0 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
137c0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
137d0 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
137e0 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
137f0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
13800 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
13810 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
13820 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
13830 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
13840 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
13850 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
13860 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
13870 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
13880 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
13890 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
138a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
138b0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
138c0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
138d0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
138e0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
138f0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
13900 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
13910 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
13920 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
13930 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13940 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
13950 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
13960 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
13970 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
13980 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
13990 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
139a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
139b0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
139c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
139d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
139e0 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
139f0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
13a00 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
13a10 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
13a20 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e  lst.    ** tryin
13a30 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72  g to save cursor
13a40 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74   positions. If t
13a50 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61  his is an automa
13a60 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73  tic rollback (as
13a70 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75  .    ** the resu
13a80 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  lt of a constrai
13a90 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  nt, malloc() fai
13aa0 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72  lure or IO error
13ab0 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  ) then .    ** t
13ac0 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20  he cache may be 
13ad0 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e  internally incon
13ae0 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e  sistent (not con
13af0 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73  tain valid trees
13b00 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63  ) so.    ** we c
13b10 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74  annot simply ret
13b20 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f  urn the error to
13b30 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73   the caller. Ins
13b40 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20  tead, abort .   
13b50 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20   ** all queries 
13b60 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e  that may be usin
13b70 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72  g any of the cur
13b80 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64  sors that failed
13b90 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f   to save..    */
13ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
13bb0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
13bc0 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64  p, rc);.  }.#end
13bd0 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  if.  btreeIntegr
13be0 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b  ity(p);.  unlock
13bf0 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
13c00 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
13c10 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
13c20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69      int rc2;..#i
13c30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13c40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13c50 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30   pBt->nTrunc = 0
13c60 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  ;.#endif..    as
13c70 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
13c80 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
13c90 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
13ca0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
13cb0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
13cc0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
13cd0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
13ce0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
13cf0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
13d00 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
13d10 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
13d20 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
13d30 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
13d40 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74  * call sqlite3Bt
13d50 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
13d60 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
13d70 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
13d80 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
13d90 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
13da0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13db0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
13dc0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
13dd0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
13de0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
13df0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
13e00 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
13e10 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
13e20 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
13e30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
13e40 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
13e50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69  .  }..  if( p->i
13e60 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
13e70 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  NE ){.    assert
13e80 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
13e90 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74  ion>0 );.    pBt
13ea0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
13eb0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
13ec0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
13ed0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
13ee0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
13ef0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
13f00 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   }..  p->inTrans
13f10 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
13f20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
13f30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
13f40 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
13f50 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
13f60 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
13f70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13f80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13f90 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
13fa0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
13fb0 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e  on.  The subtran
13fc0 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63  saction can.** c
13fd0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
13fe0 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
13ff0 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
14000 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20  saction..** You 
14010 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
14020 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
14030 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
14040 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
14050 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
14060 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
14070 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d  tically if the m
14080 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ain transaction.
14090 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  ** commits or ro
140a0 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
140b0 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e  Only one subtran
140c0 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61  saction may be a
140d0 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e  ctive at a time.
140e0 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
140f0 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74   to try.** to st
14100 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61  art a new subtra
14110 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74  nsaction if anot
14120 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69  her subtransacti
14130 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
14140 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  tive..**.** Stat
14150 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
14160 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
14170 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
14180 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
14190 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
141a0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
141b0 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
141c0 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
141d0 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
141e0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
141f0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
14200 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
14210 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
14220 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
14230 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
14240 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
14250 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
14260 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
14270 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
14280 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
14290 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
142a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
142b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
142c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
142d0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
142e0 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  f( (p->inTrans!=
142f0 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
14300 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
14310 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
14320 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
14330 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
14340 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
14350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
14360 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
14370 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
14380 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
14390 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
143a0 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65  OK : sqlite3Page
143b0 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e  rStmtBegin(pBt->
143c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74  pPager);.    pBt
143d0 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20  ->inStmt = 1;.  
143e0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
143f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14400 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
14410 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74   Commit the stat
14420 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
14430 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
14440 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e   progress.  If n
14450 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74  o.** subtransact
14460 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74  ion is active, t
14470 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
14480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14490 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74  reeCommitStmt(Bt
144a0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
144b0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
144c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
144d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
144e0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
144f0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42   p->db;.  if( pB
14500 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
14510 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
14520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14530 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
14540 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d  Bt->pPager);.  }
14550 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
14560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14570 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
14580 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14590 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
145a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
145b0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69  ollback the acti
145c0 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  ve statement sub
145d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
145e0 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69   no subtransacti
145f0 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20  on.** is active 
14600 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14610 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41  a no-op..**.** A
14620 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
14630 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  be invalidated b
14640 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
14650 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a  .  Any attempt.*
14660 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  * to use a curso
14670 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  r that was open 
14680 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
14690 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
146a0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c  on.** will resul
146b0 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
146c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
146d0 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42  eeRollbackStmt(B
146e0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
146f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14700 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14710 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
14720 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14730 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
14740 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  >db;.  if( pBt->
14750 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e  inStmt && !pBt->
14760 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
14770 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14780 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42  rStmtRollback(pB
14790 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
147a0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
147b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
147c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
147d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
147e0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
147f0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
14800 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
14810 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
14820 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61  * iTable.  The a
14830 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20  ct of acquiring 
14840 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20  a cursor gets a 
14850 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a  read lock on .**
14860 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14870 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  le..**.** If wrF
14880 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
14890 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
148a0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
148b0 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
148c0 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
148d0 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
148e0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
148f0 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
14900 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
14910 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
14920 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
14930 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
14940 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
14950 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
14960 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
14970 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
14980 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
14990 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
149a0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
149b0 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
149c0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
149d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
149e0 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
149f0 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
14a00 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
14a10 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
14a20 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
14a30 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
14a40 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
14a50 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
14a60 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
14a70 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
14a80 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
14a90 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
14aa0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
14ab0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
14ac0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
14ad0 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
14ae0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
14af0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14b00 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
14b10 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
14b20 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
14b30 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
14b40 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
14b50 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
14b60 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
14b70 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
14b80 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
14b90 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
14ba0 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
14bb0 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
14bc0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
14bd0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
14be0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
14bf0 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
14c00 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
14c10 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
14c20 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
14c30 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14c60 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
14c70 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
14ca0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
14cb0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
14cc0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ce0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
14cf0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
14d00 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
14d10 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
14d20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
14d30 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
14d40 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
14d50 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
14d80 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
14d90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
14da0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14db0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
14dc0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
14dd0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
14de0 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
14df0 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
14e00 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65  Only ){.      re
14e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
14e20 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
14e30 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
14e40 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c  ks(p, iTable, 0,
14e50 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
14e60 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
14e70 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
14e80 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
14e90 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  =0 ){.    rc = l
14ea0 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
14eb0 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  y(p);.    if( rc
14ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14ed0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14ee0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
14ef0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
14f00 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72  rFlag ){.      r
14f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
14f20 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
14f30 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
14f40 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
14f50 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  ;.  if( iTable==
14f60 31 20 26 26 20 70 61 67 65 72 50 61 67 65 63 6f  1 && pagerPageco
14f70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
14f80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
14f90 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
14fa0 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
14fb0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
14fc0 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
14fd0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
14fe0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
14ff0 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b  pCur->pPage, 0);
15000 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
15020 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
15030 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  xception;.  }.. 
15040 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
15050 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
15060 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
15070 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
15080 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
15090 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20  ables, link the 
150a0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
150b0 42 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e  BtShared list an
150c0 64 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68  d set *ppCur (th
150d0 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72  e.  ** output ar
150e0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
150f0 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20  unction)..  */. 
15100 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
15110 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
15120 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
15130 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
15140 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  t;.  pCur->wrFla
15150 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43  g = wrFlag;.  pC
15160 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
15170 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
15180 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
15190 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
151a0 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
151b0 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
151c0 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
151d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
151e0 5f 49 4e 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74  _INVALID;..  ret
151f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
15200 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
15210 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61  ception:.  relea
15220 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
15230 67 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  ge);.  unlockBtr
15240 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
15250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15260 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15270 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
15280 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
152b0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
152c0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
152f0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
15300 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
15310 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
15340 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
15350 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
15360 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15380 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
15390 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
153a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
153d0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
153e0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
153f0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
15400 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
15410 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
15420 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
15430 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
15440 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
15450 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
15460 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15470 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15480 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15490 43 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20  CursorSize(){.  
154a0 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74  return sizeof(Bt
154b0 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a  Cursor);.}..../*
154c0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
154d0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
154e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
154f0 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
15500 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
15510 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
15520 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
15530 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
15540 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
15550 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
15560 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
15570 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
15580 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ree ){.    BtSha
15590 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
155a0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
155b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
155c0 65 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62  ee);.    pBt->db
155d0 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20   = pBtree->db;. 
155e0 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
155f0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
15600 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
15610 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
15620 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
15630 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
15640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
15650 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
15660 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
15670 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
15680 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
15690 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
156a0 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
156b0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
156c0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
156d0 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  );.    unlockBtr
156e0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
156f0 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
15700 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
15710 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  r);.    /* sqlit
15720 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
15730 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
15740 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
15750 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
15760 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15770 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61  * Make a tempora
15780 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c  ry cursor by fil
15790 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c  ling in the fiel
157a0 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a  ds of pTempCur..
157b0 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ** The temporary
157c0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f   cursor is not o
157d0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73  n the cursor lis
157e0 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e  t for the Btree.
157f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15800 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
15810 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
15820 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65  r, BtCursor *pTe
15830 6d 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  mpCur){.  assert
15840 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
15850 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65  ex(pCur) );.  me
15860 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70  mcpy(pTempCur, p
15870 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75  Cur, sizeof(*pCu
15880 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  r));.  pTempCur-
15890 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54  >pNext = 0;.  pT
158a0 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20  empCur->pPrev = 
158b0 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43 75  0;.  if( pTempCu
158c0 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20  r->pPage ){.    
158d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
158e0 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d  pTempCur->pPage-
158f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
15900 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
15910 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
15920 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61  r such as was ma
15930 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65  de by the Create
15940 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28  TemporaryCursor(
15950 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62  ).** function ab
15960 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ove..*/.void sql
15970 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65  ite3BtreeRelease
15980 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
15990 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
159a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
159b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
159c0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67    if( pCur->pPag
159d0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
159e0 50 61 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d  PagerUnref(pCur-
159f0 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  >pPage->pDbPage)
15a00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
15a10 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
15a20 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
15a30 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
15a40 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
15a50 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
15a60 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
15a70 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
15a80 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65  , call.** sqlite
15a90 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
15aa0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
15ab0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
15ac0 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
15ad0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
15ae0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
15af0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
15b00 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
15b10 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
15b20 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
15b30 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15b40 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
15b50 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
15b60 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
15b70 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
15b80 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
15b90 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
15ba0 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
15bb0 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
15bc0 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
15bd0 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
15be0 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
15bf0 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
15c00 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
15c10 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
15c20 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
15c30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
15c40 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
15c50 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
15c60 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
15c70 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
15c80 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
15c90 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
15ca0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
15cb0 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
15cc0 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
15cd0 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
15ce0 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
15cf0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
15d00 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
15d10 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
15d20 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
15d30 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65   info;.    memse
15d40 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
15d50 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73  of(info));.    s
15d60 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
15d70 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
15d80 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e  , pCur->idx, &in
15d90 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
15da0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
15db0 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
15dc0 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
15dd0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
15de0 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
15df0 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
15e00 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
15e10 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
15e20 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
15e30 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
15e40 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
15e50 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
15e60 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
15e70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
15e80 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
15e90 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
15ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
15eb0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
15ec0 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
15ed0 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  idx, &pCur->info
15ee0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
15ef0 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
15f00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
15f10 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
15f20 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
15f30 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
15f40 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
15f50 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
15f60 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
15f70 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
15f80 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
15f90 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
15fa0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
15fe0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
15ff0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71          \.    sq
16030 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
16040 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
16050 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75   pCur->idx, &pCu
16060 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20  r->info);       
16070 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61    \.    pCur->va
16080 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
160c0 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
16110 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
16120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
16160 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a  _MSC_VER */../*.
16170 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
16180 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
16190 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
161a0 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
161b0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
161c0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
161d0 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
161e0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
161f0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
16200 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
16210 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
16220 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
16230 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
16240 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
16250 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16260 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
16270 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
16280 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
16290 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
162a0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
162b0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
162c0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
162d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
162e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
162f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
16300 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
16310 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
16320 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
16330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
16340 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
16350 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
16360 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
16370 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
16380 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
16390 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
163a0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
163b0 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
163c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
163d0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
163e0 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
163f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
16400 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16420 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
16430 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
16440 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
16450 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
16460 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
16470 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61  points to.  Alwa
16480 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ys return SQLITE
16490 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20  _OK..** Failure 
164a0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
164b0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
164c0 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
164d0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
164e0 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20  an entry (which 
164f0 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
16500 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74  example, if.** t
16510 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
16520 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a  mpty) then *pSiz
16530 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  e is set to 0..*
16540 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16550 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
16560 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
16570 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
16580 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
16590 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
165a0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
165b0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
165c0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
165d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
165e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
165f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
16600 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
16610 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
16620 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
16630 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
16640 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
16650 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
16660 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76   pointing at a v
16670 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74  alid entry - set
16680 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f   *pSize to 0. */
16690 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
166a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
166b0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
166c0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
166d0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
166e0 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  .nData;.    }.  
166f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16700 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
16710 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
16720 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
16730 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
16740 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
16750 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
16760 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
16770 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16780 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
16790 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
167a0 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
167b0 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
167c0 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
167d0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
167e0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
167f0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
16800 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
16810 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
16820 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
16830 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
16840 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
16850 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
16860 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
16870 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65  * Unless pPgnoNe
16880 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  xt is NULL, the 
16890 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
168a0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
168b0 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65   .** page in the
168c0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
168d0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
168e0 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
168f0 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  vfl.** is the la
16900 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
16910 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67  inked list, *pPg
16920 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
16930 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
16940 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
16950 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20  ULL, *ppPage is 
16960 73 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  set to the MemPa
16970 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f  ge* handle.** fo
16980 72 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65  r page ovfl. The
16990 20 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65   underlying page
169a0 72 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20  r page may have 
169b0 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a  been requested.*
169c0 2a 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e  * with the noCon
169d0 74 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73  tent flag set, s
169e0 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  o the page data 
169f0 61 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a  accessable via.*
16a00 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61  * this handle ma
16a10 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  y not be trusted
16a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16a30 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
16a40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16a50 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  , .  Pgno ovfl, 
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a70 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
16a80 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
16a90 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
16aa0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
16ab0 50 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  Page handle */. 
16ac0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ae0 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
16af0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
16b00 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
16b10 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
16b20 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
16b30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16b40 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
16b50 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65 20  /* One of these 
16b60 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c  must not be NULL
16b70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 79  . Otherwise, why
16b80 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
16b90 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion? */.  assert
16ba0 28 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f  (ppPage || pPgno
16bb0 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Next);..  /* If 
16bc0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c  pPgnoNext is NUL
16bd0 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
16be0 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
16bf0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a  alled to obtain.
16c00 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20    ** a MemPage* 
16c10 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20  reference only. 
16c20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73 20  No page-data is 
16c30 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 69 73  required in this
16c40 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   case..  */.  if
16c50 28 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a  ( !pPgnoNext ){.
16c60 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
16c70 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
16c80 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65  Bt, ovfl, ppPage
16c90 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  , 1);.  }..#ifnd
16ca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16cb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
16cc0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
16cd0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
16ce0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
16cf0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
16d00 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
16d10 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
16d20 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
16d30 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
16d40 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
16d50 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
16d60 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
16d70 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
16d80 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
16d90 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
16da0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
16db0 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
16dc0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
16dd0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
16de0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
16df0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
16e00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
16e10 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
16e20 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
16e30 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
16e40 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
16e50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
16e60 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
16e70 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
16e80 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
16e90 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
16ea0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
16eb0 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
16ec0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
16ed0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
16ee0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
16ef0 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
16f00 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
16f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16f20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16f30 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
16f40 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
16f50 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
16f60 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
16f70 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
16f80 47 75 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20  Guess;.      }. 
16f90 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
16fa0 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c  .  if( next==0 |
16fb0 7c 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  | ppPage ){.    
16fc0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
16fd0 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71   0;..    rc = sq
16fe0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
16ff0 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
17000 61 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20  age, next!=0);. 
17010 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51     assert(rc==SQ
17020 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
17030 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ==0);.    if( ne
17040 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  xt==0 && rc==SQL
17050 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17060 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
17070 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
17080 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70     }..    if( pp
17090 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  Page ){.      *p
170a0 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
170b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
170c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
170d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
170e0 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
170f0 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t;..  return rc;
17100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64  .}../*.** Copy d
17110 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
17120 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20  r to a page, or 
17130 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61  from a page to a
17140 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70   buffer..**.** p
17150 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69  Payload is a poi
17160 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f  nter to data sto
17170 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20  red on database 
17180 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a  page pDbPage..**
17190 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70   If argument eOp
171a0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
171b0 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64  nByte bytes of d
171c0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a  ata are copied.*
171d0 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20  * from pPayload 
171e0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
171f0 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66  inted at by pBuf
17200 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65  . If eOp is true
17210 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65  ,.** then sqlite
17220 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
17230 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61   called on pDbPa
17240 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74  ge and nByte byt
17250 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72  es.** of data ar
17260 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
17270 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f  e buffer pBuf to
17280 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a   pPayload..**.**
17290 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
172a0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
172b0 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  s, otherwise an 
172c0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
172d0 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61  tatic int copyPa
172e0 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70  yload(.  void *p
172f0 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  Payload,        
17300 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
17310 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
17320 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
17330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
17340 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a  nter to buffer *
17350 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17370 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
17380 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
17390 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t eOp,          
173a0 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20          /* 0 -> 
173b0 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20  copy from page, 
173c0 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67  1 -> copy to pag
173d0 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70  e */.  DbPage *p
173e0 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20  DbPage          
173f0 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
17400 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a  ing pPayload */.
17410 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a  ){.  if( eOp ){.
17420 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
17430 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20   from buffer to 
17440 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70  page (a write op
17450 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
17460 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
17470 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
17480 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
17490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
174a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
174b0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
174c0 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20  pPayload, pBuf, 
174d0 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
174e0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
174f0 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62  a from page to b
17500 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70  uffer (a read op
17510 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
17520 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61  memcpy(pBuf, pPa
17530 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20  yload, nByte);. 
17540 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17550 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
17570 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72   used to read or
17580 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f   overwrite paylo
17590 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ad information.*
175a0 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * for the entry 
175b0 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75  that the pCur cu
175c0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
175d0 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a   to. If the eOp.
175e0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
175f0 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61  0, this is a rea
17600 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74  d operation (dat
17610 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a  a copied into.**
17620 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49   buffer pBuf). I
17630 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f it is non-zero
17640 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20  , a write (data 
17650 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62  copied from.** b
17660 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a  uffer pBuf)..**.
17670 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
17680 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
17690 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
176a0 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
176b0 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
176c0 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
176d0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
176e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
176f0 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  ine does not mak
17700 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20  e a distinction 
17710 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20  between key and 
17720 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74  data..** It just
17730 20 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73   reads or writes
17740 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
17750 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44  payload area.  D
17760 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70  ata might .** ap
17770 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
17780 20 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74   page or be scat
17790 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c  tered out on mul
177a0 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a  tiple overflow .
177b0 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** pages..**.** 
177c0 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
177d0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
177e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e   flag is set, an
177f0 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  d the current.**
17800 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
17810 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
17820 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
17830 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
17840 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20  allocates space 
17850 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
17860 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65  opluates the ove
17870 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
17880 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20  .** cache array 
17890 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
178a0 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74  low). Subsequent
178b0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a   calls use this.
178c0 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  ** cache to make
178d0 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
178e0 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
178f0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
17900 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
17910 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
17920 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
17930 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61  allocated, it ma
17940 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  y be.** invalida
17950 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
17960 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20  r cursor writes 
17970 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  to the same tabl
17980 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20  e, or if.** the 
17990 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
179a0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72  to a different r
179b0 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  ow. Additionally
179c0 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  , in auto-vacuum
179d0 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f  .** mode, the fo
179e0 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d  llowing events m
179f0 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  ay invalidate an
17a00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
17a10 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  ist cache..**.**
17a20 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e     * An incremen
17a30 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20  tal vacuum,.**  
17a40 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61   * A commit in a
17a50 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c  uto_vacuum="full
17a60 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43  " mode,.**   * C
17a70 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  reating a table 
17a80 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76  (may require mov
17a90 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ing an overflow 
17aa0 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  page)..*/.static
17ab0 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f   int accessPaylo
17ac0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
17ad0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
17ae0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
17af0 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
17b00 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  rom */.  int off
17b10 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  set,          /*
17b20 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74   Begin reading t
17b30 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79  his far into pay
17b40 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  load */.  int am
17b50 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
17b60 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79  * Read this many
17b70 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69   bytes */.  unsi
17b80 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c  gned char *pBuf,
17b90 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79   /* Write the by
17ba0 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75  tes into this bu
17bb0 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73  ffer */ .  int s
17bc0 6b 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20  kipKey,         
17bd0 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73  /* offset begins
17be0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
17bf0 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   is true */.  in
17c00 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
17c10 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
17c20 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
17c30 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
17c40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
17c50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
17c60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17c70 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
17c80 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
17c90 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
17ca0 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 2f 2a  r->pPage;     /*
17cb0 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
17cc0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
17cd0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
17ce0 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
17cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
17d00 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
17d10 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
17d20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
17d30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
17d40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17d50 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
17d60 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
17d70 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
17d80 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
17d90 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
17da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
17db0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
17dc0 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
17dd0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
17de0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
17df0 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
17e00 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
17e10 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
17e20 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
17e30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
17e40 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79  ;..  if( skipKey
17e50 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b   ){.    offset +
17e60 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  = nKey;.  }.  if
17e70 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  ( offset+amt > n
17e80 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
17e90 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Data ){.    /* T
17ea0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
17eb0 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
17ec0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
17ed0 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
17ee0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17ef0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
17f00 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
17f10 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
17f20 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
17f30 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
17f40 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
17f50 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
17f60 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
17f70 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
17f80 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
17f90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
17fa0 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
17fb0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
17fc0 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
17fd0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
17fe0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
17ff0 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
18000 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
18010 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
18020 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
18030 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
18040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
18050 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
18060 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20  o.nLocal;.  }.. 
18070 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74   pBt = pCur->pBt
18080 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18090 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
180a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
180b0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
180c0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
180d0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
180e0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
180f0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
18100 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
18110 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
18120 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
18130 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
18140 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18150 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18160 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
18170 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
18180 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
18190 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
181a0 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
181b0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
181c0 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
181d0 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
181e0 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
181f0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
18200 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
18210 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
18220 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
18230 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
18240 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
18250 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
18260 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
18270 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
18280 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
18290 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
182a0 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
182b0 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
182c0 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
182d0 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
182e0 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
182f0 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
18300 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
18310 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
18320 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
18330 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
18340 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
18350 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
18360 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
18370 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
18380 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
18390 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
183a0 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
183b0 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69  *nOvfl);.      i
183c0 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75  f( nOvfl && !pCu
183d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
183e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
183f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
18400 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
18410 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
18420 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
18430 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
18440 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
18450 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
18460 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
18470 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
18480 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
18490 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
184a0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
184b0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
184c0 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
184d0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
184e0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
184f0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
18500 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
18510 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
18520 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
18530 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
18540 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
18550 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
18560 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
18570 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
18580 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
18590 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
185a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
185b0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
185c0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
185d0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
185e0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
185f0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
18600 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
18610 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
18620 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
18630 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
18640 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18650 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
18660 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
18670 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
18680 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
18690 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
186a0 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
186b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
186c0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
186d0 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
186e0 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
186f0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
18700 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
18710 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
18720 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
18730 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
18740 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
18750 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
18760 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
18770 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
18780 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
18790 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
187a0 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
187b0 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
187c0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
187d0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
187e0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
187f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18800 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
18810 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
18820 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
18830 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18840 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
18850 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
18860 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18870 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
18880 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
18890 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
188a0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
188b0 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
188c0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
188d0 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
188e0 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
188f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
18900 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
18910 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
18920 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
18930 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
18940 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
18950 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
18960 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
18970 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
18980 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18990 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
189a0 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
189b0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
189c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
189d0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
189e0 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
189f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18a10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
18a20 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
18a30 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
18a40 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18a50 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
18a60 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
18a70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
18a80 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
18a90 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
18aa0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
18ab0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
18ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18ad0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
18ae0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
18af0 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
18b00 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
18b10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18b20 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
18b30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
18b40 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
18b50 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
18b60 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
18b70 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
18b80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18b90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18ba0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
18bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18bc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18bd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18be0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
18bf0 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
18c00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18c10 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
18c20 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
18c30 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
18c40 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
18c50 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
18c60 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
18c70 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
18c80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18c90 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
18ca0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
18cb0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
18cc0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
18cd0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
18ce0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
18cf0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
18d00 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
18d10 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
18d20 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
18d30 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
18d40 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
18d50 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
18d60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
18d70 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
18d80 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
18d90 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
18da0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
18db0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
18dd0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18de0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18df0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18e00 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
18e10 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
18e20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
18e30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18e40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18e50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
18e60 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
18e70 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
18e80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18e90 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
18ea0 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
18eb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
18ec0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
18ed0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
18ee0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
18ef0 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29  har*)pBuf, 0, 0)
18f00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
18f20 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
18f30 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
18f40 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
18f50 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
18f60 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
18f70 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
18f80 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
18f90 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
18fa0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
18fb0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18fc0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
18fd0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
18fe0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
18ff0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
19000 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
19010 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
19020 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
19030 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
19040 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
19050 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
19060 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
19070 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
19080 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
19090 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
190a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
190b0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
190c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
190d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
190e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
190f0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
19100 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
19110 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19120 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
19130 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
19140 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19160 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19170 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19180 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19190 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
191a0 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
191b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
191c0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
191d0 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
191e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
191f0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
19200 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
19210 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b  mt, pBuf, 1, 0);
19220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19240 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
19250 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
19260 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
19270 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
19280 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
19290 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
192a0 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
192b0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
192c0 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
192d0 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
192e0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
192f0 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
19300 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
19310 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
19320 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
19330 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
19340 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
19350 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
19360 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
19370 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
19380 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
19390 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
193a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
193b0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
193c0 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
193d0 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
193e0 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
193f0 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
19400 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
19410 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
19420 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
19430 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
19440 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
19450 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
19460 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
19470 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
19480 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
19490 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
194a0 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
194b0 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
194c0 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
194d0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
194e0 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
194f0 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65  eassembly.** the
19500 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
19510 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
19520 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
19530 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
19540 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
19550 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
19560 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
19570 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
19580 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19590 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
195a0 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
195b0 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
195c0 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
195d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
195e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
195f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19600 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
19610 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
19620 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
19630 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
19640 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
19650 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
19660 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19670 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
19680 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
19690 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
196a0 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
196b0 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
196c0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
196d0 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
196e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
196f0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
19700 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
19710 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
19720 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
19730 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
19740 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
19750 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
19760 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19770 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
19780 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19790 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
197a0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
197b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
197c0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
197d0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
197e0 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
197f0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
19800 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
19810 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
19820 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
19830 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
19840 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
19850 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
19860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
19870 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
19880 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
19890 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
198a0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
198b0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
198c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
198d0 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
198e0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
198f0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
19900 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
19910 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
19920 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
19930 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
19940 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
19950 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
19960 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
19970 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
19980 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
19990 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
199a0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
199b0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
199c0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
199d0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
199e0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
199f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
19a00 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
19a10 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
19a20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
19a30 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
19a40 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
19a50 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
19a60 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
19a70 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
19a80 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
19a90 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
19aa0 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
19ab0 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
19ac0 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
19ad0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
19ae0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
19af0 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
19b00 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
19b10 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
19b20 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
19b30 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
19b40 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
19b50 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
19b60 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
19b70 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
19b80 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
19b90 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
19ba0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
19bb0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
19bc0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
19bd0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
19be0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19bf0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19c00 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
19c10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19c20 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
19c30 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
19c40 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
19c50 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
19c60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
19c70 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
19c80 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
19c90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19ca0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
19cb0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19cc0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19cd0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19ce0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19cf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
19d00 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
19d10 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
19d20 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
19d30 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
19d40 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
19d50 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
19d60 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
19d70 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
19d80 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
19d90 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
19da0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
19db0 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve to..*/.static
19dc0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
19dd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
19de0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
19df0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
19e00 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
19e10 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67  MemPage *pOldPag
19e20 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
19e30 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
19e40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19e50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19e60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
19e70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19e80 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
19e90 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
19ea0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
19eb0 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72   &pNewPage, pCur
19ec0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  ->pPage);.  if( 
19ed0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
19ee0 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50    pNewPage->idxP
19ef0 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64  arent = pCur->id
19f00 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20  x;.  pOldPage = 
19f10 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
19f20 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66  OldPage->idxShif
19f30 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  t = 0;.  release
19f40 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a  Page(pOldPage);.
19f50 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
19f60 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
19f70 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75  ->idx = 0;.  pCu
19f80 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
19f90 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
19fa0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
19fb0 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
19fc0 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
19fd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19fe0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
19ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a000 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1a010 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
1a020 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
1a030 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
1a040 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
1a050 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
1a060 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
1a070 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
1a080 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
1a090 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
1a0a0 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
1a0b0 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
1a0c0 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
1a0d0 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
1a0e0 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
1a0f0 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
1a100 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
1a110 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
1a120 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
1a130 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
1a140 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
1a150 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
1a160 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1a170 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1a180 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1a190 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
1a1a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a1b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1a1c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
1a1d0 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
1a1e0 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61  arent;.  if( pPa
1a1f0 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  rent==0 ) return
1a200 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e   1;.  if( pParen
1a210 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75  t->pgno>1 ) retu
1a220 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32  rn 0;.  if( get2
1a230 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1a240 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1a250 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29  rOffset+3])==0 )
1a260 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1a270 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1a280 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a290 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
1a2a0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
1a2b0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1a2c0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
1a2d0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1a2e0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
1a2f0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1a300 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
1a310 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1a320 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
1a330 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
1a340 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
1a350 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
1a360 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
1a370 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
1a380 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1a390 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1a3a0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
1a3b0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1a3c0 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61  pParent;.  MemPa
1a3d0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
1a3e0 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61   idxParent;..  a
1a3f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1a400 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1a410 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1a420 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a430 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65  VALID );.  pPage
1a440 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1a450 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
1a460 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a470 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52  !sqlite3BtreeIsR
1a480 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1a490 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
1a4a0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
1a4b0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
1a4c0 3d 30 20 29 3b 0a 20 20 69 64 78 50 61 72 65 6e  =0 );.  idxParen
1a4d0 74 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61  t = pPage->idxPa
1a4e0 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  rent;.  sqlite3P
1a4f0 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
1a500 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 6c  >pDbPage);.  rel
1a510 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1a520 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
1a530 20 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72   pParent;.  pCur
1a540 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1a550 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1a560 4b 65 79 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Key = 0;.  asser
1a570 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  t( pParent->idxS
1a580 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75  hift==0 );.  pCu
1a590 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65  r->idx = idxPare
1a5a0 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  nt;.}../*.** Mov
1a5b0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1a5c0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
1a5d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1a5e0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
1a5f0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
1a600 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
1a610 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a620 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
1a630 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
1a640 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a650 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
1a660 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1a670 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1a680 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
1a690 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
1a6a0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
1a6b0 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
1a6c0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
1a6d0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
1a6e0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
1a6f0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
1a700 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
1a710 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
1a720 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
1a730 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
1a740 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a750 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
1a760 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
1a770 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  skip;.    }.    
1a780 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
1a790 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ion(pCur);.  }. 
1a7a0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
1a7b0 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
1a7c0 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  t && pRoot->pgno
1a7d0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
1a7e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a7f0 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b  pRoot->isInit );
1a800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1a810 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
1a820 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
1a830 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
1a840 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
1a850 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b  Root, 0)).    ){
1a860 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
1a870 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1a880 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
1a890 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1a8a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1a8b0 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
1a8c0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f  Cur->pPage = pRo
1a8d0 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  ot;.  }.  pCur->
1a8e0 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  idx = 0;.  pCur-
1a8f0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1a900 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
1a910 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1a920 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1a930 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
1a940 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
1a950 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
1a960 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72  bpage;.    asser
1a970 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
1a980 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65  1 );.    subpage
1a990 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
1a9a0 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
1a9b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1a9c0 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70      assert( subp
1a9d0 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75  age>0 );.    pCu
1a9e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1a9f0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
1aa00 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1aa10 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
1aa20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
1aa30 65 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61 67  e = ((pCur->pPag
1aa40 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53  e->nCell>0)?CURS
1aa50 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f  OR_VALID:CURSOR_
1aa60 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74 75  INVALID);.  retu
1aa70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1aa80 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1aa90 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
1aaa0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
1aab0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
1aac0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
1aad0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1aae0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
1aaf0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1ab00 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
1ab10 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
1ab20 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
1ab30 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
1ab40 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1ab50 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
1ab60 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1ab70 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
1ab80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ab90 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
1aba0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
1abb0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1abc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1abd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1abe0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1abf0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
1ac00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ac10 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1ac20 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
1ac30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1ac40 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
1ac50 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1ac60 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
1ac70 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1ac80 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1ac90 69 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  idx));.    rc = 
1aca0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1acb0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
1acc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1acd0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1ace0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
1acf0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
1ad00 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1ad10 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
1ad20 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
1ad30 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
1ad40 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
1ad50 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
1ad60 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
1ad70 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
1ad80 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
1ad90 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1ada0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
1adb0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1adc0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
1add0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1ade0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
1adf0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
1ae00 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
1ae10 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
1ae20 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
1ae30 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1ae40 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
1ae50 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
1ae60 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
1ae70 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1ae80 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
1ae90 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
1aea0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
1aeb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1aec0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
1aed0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1aee0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1aef0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1af00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1af10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1af20 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
1af30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1af40 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
1af50 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
1af60 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1af70 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1af80 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1af90 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
1afa0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
1afb0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
1afc0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1afd0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
1afe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aff0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64   ){.    pCur->id
1b000 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
1b010 20 2d 20 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e   - 1;.    pCur->
1b020 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1b030 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1b040 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
1b050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b060 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1b070 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1b080 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1b090 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1b0a0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1b0b0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1b0c0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1b0d0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1b0e0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1b0f0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1b100 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1b110 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1b120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b130 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1b140 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1b150 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
1b160 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b170 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1b190 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b1a0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1b1b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1b1c0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b1d0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1b1e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b1f0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b200 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1b210 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
1b220 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1b230 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1b240 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b250 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b260 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1b270 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1b280 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
1b290 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1b2a0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1b2b0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1b2c0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1b2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b2e0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1b2f0 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
1b300 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1b310 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1b320 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1b330 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1b340 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1b350 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1b360 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1b370 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1b380 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1b390 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1b3a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
1b3b0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1b3c0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1b3d0 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
1b3e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1b3f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1b400 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b410 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1b420 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1b430 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1b440 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1b450 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1b470 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1b480 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1b490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1b4a0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1b4b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1b4c0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
1b4d0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1b4e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1b4f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1b500 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1b510 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1b520 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1b530 3b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  ;.      getCellI
1b540 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
1b550 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
1b560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  rc==SQLITE_OK;. 
1b570 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b580 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1b590 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
1b5a0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1b5b0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
1b5c0 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
1b5d0 66 69 65 64 20 62 79 20 70 4b 65 79 2f 6e 4b 65  fied by pKey/nKe
1b5e0 79 2f 70 55 6e 4b 65 79 2e 20 52 65 74 75 72 6e  y/pUnKey. Return
1b5f0 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
1b600 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
1b610 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74  Y tables, only t
1b620 68 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74 65  he nKey paramete
1b630 72 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  r is used.  pKey
1b640 20 0a 2a 2a 20 61 6e 64 20 70 55 6e 4b 65 79 20   .** and pUnKey 
1b650 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
1b660 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
1b670 20 65 69 74 68 65 72 20 70 55 6e 4b 65 79 0a 2a   either pUnKey.*
1b680 2a 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  * must point to 
1b690 61 20 6b 65 79 20 74 68 61 74 20 68 61 73 20 61  a key that has a
1b6a0 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 70 61  lready been unpa
1b6b0 63 6b 65 64 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a  cked, or else.**
1b6c0 20 70 4b 65 79 2f 6e 4b 65 79 20 64 65 73 63 72   pKey/nKey descr
1b6d0 69 62 65 73 20 61 20 62 6c 6f 62 20 63 6f 6e 74  ibes a blob cont
1b6e0 61 69 6e 69 6e 67 20 74 68 65 20 6b 65 79 2e 0a  aining the key..
1b6f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
1b700 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
1b710 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
1b720 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
1b730 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
1b740 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
1b750 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
1b760 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
1b770 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
1b780 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
1b790 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
1b7a0 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
1b7b0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
1b7c0 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
1b7d0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
1b7e0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
1b7f0 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
1b800 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a  y to which the.*
1b810 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74  * cursor is writ
1b820 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20  ten to *pRes if 
1b830 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65  pRes!=NULL.  The
1b840 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74   meaning of.** t
1b850 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20  his value is as 
1b860 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1b870 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
1b880 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b890 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1b8a0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1b8d0 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20   pKey or if the 
1b8e0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
1b8f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b900 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
1b910 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
1b920 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
1b930 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
1b940 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
1b950 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1b960 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1b970 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
1b990 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b  actly matches pK
1b9a0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
1b9b0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
1b9c0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1b9d0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1b9e0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
1ba00 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  arger than pKey.
1ba10 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
1ba20 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  e3BtreeMoveto(. 
1ba30 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1ba40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1ba50 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
1ba60 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1ba70 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1ba80 20 54 68 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74   The key content
1ba90 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 4e   for indices.  N
1baa0 6f 74 20 75 73 65 64 20 62 79 20 74 61 62 6c 65  ot used by table
1bab0 73 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  s */.  UnpackedR
1bac0 65 63 6f 72 64 20 2a 70 55 6e 4b 65 79 2c 2f 2a  ecord *pUnKey,/*
1bad0 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
1bae0 6e 20 6f 66 20 70 4b 65 79 20 2a 2f 0a 20 20 69  n of pKey */.  i
1baf0 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
1bb00 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1bb10 20 70 4b 65 79 2e 20 20 4f 72 20 74 68 65 20 6b   pKey.  Or the k
1bb20 65 79 20 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f  ey for tables */
1bb30 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
1bb40 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ,         /* If 
1bb50 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
1bb60 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
1bb70 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
1bb80 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
1bb90 20 20 2f 2a 20 53 65 61 72 63 68 20 72 65 73 75    /* Search resu
1bba0 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20  lt flag */.){.  
1bbb0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 61  int rc;.  char a
1bbc0 53 70 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 61  Space[200];..  a
1bbd0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bbe0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bbf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1bc00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1bc10 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1bc20 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
1bc30 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1bc40 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
1bc50 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
1bc60 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
1bc70 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
1bc80 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
1bc90 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
1bca0 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
1bcb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1bcc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
1bcd0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 26  Cur->validNKey &
1bce0 26 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  & pCur->pPage->i
1bcf0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
1bd00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1bd10 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ==nKey ){.      
1bd20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1bd30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bd40 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
1bd50 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26   pCur->atLast &&
1bd60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1bd70 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  <nKey ){.      *
1bd80 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
1bd90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bda0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  K;.    }.  }... 
1bdb0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1bdc0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1bdd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1bde0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1bdf0 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
1be00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1be10 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1be20 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1be30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1be40 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
1be50 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
1be60 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1be70 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1be80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1be90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
1bea0 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
1beb0 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
1bec0 20 67 69 76 65 6e 20 61 6e 20 53 51 4c 20 74 61   given an SQL ta
1bed0 62 6c 65 20 74 6f 20 73 65 61 72 63 68 2e 20 20  ble to search.  
1bee0 54 68 65 20 6b 65 79 20 69 73 20 74 68 65 20 69  The key is the i
1bef0 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a 20 72 6f  nteger.    ** ro
1bf00 77 69 64 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  wid contained in
1bf10 20 6e 4b 65 79 2e 20 20 70 4b 65 79 20 61 6e 64   nKey.  pKey and
1bf20 20 70 55 6e 4b 65 79 20 73 68 6f 75 6c 64 20 62   pUnKey should b
1bf30 6f 74 68 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  oth be NULL */. 
1bf40 20 20 20 61 73 73 65 72 74 28 20 70 55 6e 4b 65     assert( pUnKe
1bf50 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
1bf60 72 74 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20  rt( pKey==0 );. 
1bf70 20 7d 65 6c 73 65 20 69 66 28 20 70 55 6e 4b 65   }else if( pUnKe
1bf80 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  y==0 ){.    /* W
1bf90 65 20 61 72 65 20 74 6f 20 73 65 61 72 63 68 20  e are to search 
1bfa0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 75 73 69  an SQL index usi
1bfb0 6e 67 20 61 20 6b 65 79 20 65 6e 63 6f 64 65 64  ng a key encoded
1bfc0 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20   as a blob..    
1bfd0 2a 2a 20 54 68 65 20 62 6c 6f 62 20 69 73 20 66  ** The blob is f
1bfe0 6f 75 6e 64 20 61 74 20 70 4b 65 79 20 61 6e 64  ound at pKey and
1bff0 20 69 73 20 6e 4b 65 79 20 62 79 74 65 73 20 69   is nKey bytes i
1c000 6e 20 6c 65 6e 67 74 68 2e 20 20 55 6e 70 61 63  n length.  Unpac
1c010 6b 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6b 65  k.    ** this ke
1c020 79 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  y so that we can
1c030 20 75 73 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20   use it. */.    
1c040 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20  assert( pKey!=0 
1c050 29 3b 0a 20 20 20 20 70 55 6e 4b 65 79 20 3d 20  );.    pUnKey = 
1c060 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c070 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b  dUnpack(pCur->pK
1c080 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b  eyInfo, nKey, pK
1c090 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0b0 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
1c0c0 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
1c0d0 20 20 20 20 69 66 28 20 70 55 6e 4b 65 79 3d 3d      if( pUnKey==
1c0e0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1c0f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
1c100 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
1c110 74 6f 20 73 65 61 72 63 68 20 61 6e 20 53 51 4c  to search an SQL
1c120 20 69 6e 64 65 78 20 75 73 69 6e 67 20 61 20 6b   index using a k
1c130 65 79 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  ey that is alrea
1c140 64 79 20 75 6e 70 61 63 6b 65 64 0a 20 20 20 20  dy unpacked.    
1c150 2a 2a 20 61 6e 64 20 68 61 6e 64 65 64 20 74 6f  ** and handed to
1c160 20 75 73 20 69 6e 20 70 55 6e 4b 65 79 2e 20 2a   us in pUnKey. *
1c170 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b  /.    assert( pK
1c180 65 79 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 66  ey==0 );.  }.  f
1c190 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1c1a0 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
1c1b0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
1c1c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1c1d0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1c1e0 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a   int c = -1;  /*
1c1f0 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20   pRes return if 
1c200 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d  table is empty m
1c210 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20  ust be -1 */.   
1c220 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
1c230 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
1c240 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  -1;.    if( !pPa
1c250 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 55  ge->intKey && pU
1c260 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nKey==0 ){.     
1c270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1c280 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1c290 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1c2a0 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ish;.    }.    i
1c2b0 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
1c2c0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1c2d0 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  = upr;.    }else
1c2e0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64  {.      pCur->id
1c2f0 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b  x = (upr+lwr)/2;
1c300 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c  .    }.    if( l
1c310 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b  wr<=upr ) for(;;
1c320 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
1c330 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69  CellKey;.      i
1c340 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
1c350 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1c360 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ize = 0;.      p
1c370 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1c380 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   1;.      if( pP
1c390 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1c3a0 20 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c         u8 *pCell
1c3b0 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
1c3c0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1c3d0 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b 20 70  , pCur->idx) + p
1c3e0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
1c3f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
1c400 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
1c410 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
1c420 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
1c430 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
1c440 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d  int32(pCell, dum
1c450 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  my);.        }. 
1c460 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
1c470 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
1c480 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1c490 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d    if( nCellKey==
1c4a0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nKey ){.        
1c4b0 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
1c4c0 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
1c4d0 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key<nKey ){.    
1c4e0 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1c4f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1c510 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 3b 0a  CellKey>nKey );.
1c520 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
1c530 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c550 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a   int available;.
1c560 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1c570 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68   = (void *)fetch
1c580 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61  Payload(pCur, &a
1c590 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20  vailable, 0);.  
1c5a0 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d        nCellKey =
1c5b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1c5c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76  ;.        if( av
1c5d0 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65  ailable>=nCellKe
1c5e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1c5f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1c600 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
1c610 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  lKey, pCellKey, 
1c620 70 55 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  pUnKey);.       
1c630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c640 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
1c650 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
1c660 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  lKey );.        
1c670 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
1c680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1c690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c6a0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
1c6b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1c6c0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
1c6d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1c6e0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1c6f0 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
1c700 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b  , (void *)pCellK
1c710 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ey);.          c
1c720 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1c730 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
1c740 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  lKey, pCellKey, 
1c750 70 55 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  pUnKey);.       
1c760 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c770 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
1c780 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
1c790 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c7a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c7b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
1c7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
1c7d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
1c7e0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1c7f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1c800 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
1c810 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1c820 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   lwr = pCur->idx
1c830 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  ;.          upr 
1c840 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20  = lwr - 1;.     
1c850 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c870 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1c880 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1c890 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c8a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1c8b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c8c0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1c8d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1c8e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
1c8f0 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b  r = pCur->idx+1;
1c900 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c910 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72        upr = pCur
1c920 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  ->idx-1;.      }
1c930 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
1c940 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  pr ){.        pC
1c950 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
1c960 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1c970 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c980 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
1c990 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
1c9a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c9b0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
1c9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c9d0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
1c9e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1c9f0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1ca00 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1ca10 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
1ca20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
1ca30 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1ca40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ca50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ca60 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
1ca70 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1ca80 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1ca90 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
1caa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
1cab0 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
1cac0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1cad0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1cae0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
1caf0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1cb00 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1cb10 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
1cb20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1cb30 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1cb40 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
1cb50 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20  ur->idx = lwr;. 
1cb60 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1cb70 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1cb80 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1cb90 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1cba0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
1cbb0 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
1cbc0 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1cbd0 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74  inish;.  }.movet
1cbe0 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 69 66 28 20  o_finish:.  if( 
1cbf0 70 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  pKey ){.    /* I
1cc00 66 20 77 65 20 63 72 65 61 74 65 64 20 6f 75 72  f we created our
1cc10 20 6f 77 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65   own unpacked ke
1cc20 79 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  y at the top of 
1cc30 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1cc40 65 64 75 72 65 2c 20 74 68 65 6e 20 64 65 73 74  edure, then dest
1cc50 72 6f 79 20 74 68 61 74 20 6b 65 79 20 62 65 66  roy that key bef
1cc60 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
1cc70 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1cc80 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
1cc90 65 63 6f 72 64 28 70 55 6e 4b 65 79 29 3b 0a 20  ecord(pUnKey);. 
1cca0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ccb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
1ccc0 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
1ccd0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1cce0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1ccf0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
1cd00 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
1cd10 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
1cd20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
1cd30 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
1cd40 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
1cd50 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1cd60 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
1cd70 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
1cd80 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
1cd90 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
1cda0 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
1cdb0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
1cdc0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1cdd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
1cde0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1cdf0 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
1ce00 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
1ce10 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
1ce20 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
1ce30 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
1ce40 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
1ce50 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
1ce60 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
1ce70 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
1ce80 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
1ce90 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
1cea0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
1ceb0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
1cec0 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
1ced0 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
1cee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1cef0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  n the database c
1cf00 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
1cf10 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
1cf20 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
1cf30 65 33 42 74 72 65 65 43 75 72 73 6f 72 44 62 28  e3BtreeCursorDb(
1cf40 63 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a  const BtCursor *
1cf50 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
1cf60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1cf70 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1cf80 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1cf90 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70    return pCur->p
1cfa0 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  Btree->db;.}../*
1cfb0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
1cfc0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
1cfd0 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
1cfe0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1cff0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1d000 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1d010 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1d020 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1d030 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
1d040 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1d050 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1d060 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1d070 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1d080 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
1d090 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1d0a0 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
1d0b0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1d0c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
1d0d0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1d0e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1d0f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1d100 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1d110 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1d120 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
1d130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1d150 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
1d160 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
1d170 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
1d180 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1d190 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1d1a0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
1d1b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d1c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1d1d0 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
1d1e0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1d1f0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1d200 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1d210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1d220 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
1d230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1d240 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1d250 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70  ert( pCur->idx<p
1d260 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
1d270 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
1d280 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1d290 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1d2a0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1d2b0 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  if( pCur->idx>=p
1d2c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1d2d0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1d2e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1d2f0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1d300 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
1d310 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1d320 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
1d330 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1d340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d350 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1d360 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1d370 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1d380 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d390 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
1d3a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
1d3b0 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
1d3c0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
1d3d0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1d3e0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1d3f0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1d400 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d420 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d430 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1d440 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
1d450 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1d460 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  age;.    }while(
1d470 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67   pCur->idx>=pPag
1d480 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1d490 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
1d4a0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1d4b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1d4c0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1d4d0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1d4e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d4f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d500 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1d510 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1d520 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1d530 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1d540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d550 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1d560 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1d570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d580 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
1d590 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
1d5a0 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
1d5b0 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
1d5c0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1d5d0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1d5e0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1d5f0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1d600 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1d610 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
1d620 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1d630 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1d640 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1d650 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1d660 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1d670 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d680 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
1d690 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1d6a0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1d6b0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65   Pgno pgno;.  Me
1d6c0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1d6d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d6e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d6f0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1d700 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1d710 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1d720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d740 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
1d750 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
1d760 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1d770 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
1d780 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1d790 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d7a0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1d7b0 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43  skip<0 ){.    pC
1d7c0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1d7d0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1d7e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d7f0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1d800 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
1d810 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1d820 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d830 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
1d840 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
1d850 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  =0 );.  if( !pPa
1d860 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1d870 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
1d880 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1d890 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20   pCur->idx) );. 
1d8a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1d8b0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1d8c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1d8d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d8e0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1d8f0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1d900 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
1d910 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
1d920 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  idx==0 ){.      
1d930 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
1d940 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  IsRootPage(pPage
1d950 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  ) ){.        pCu
1d960 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1d970 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1d980 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1d990 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1d9a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1d9b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1d9c0 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
1d9d0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
1d9e0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1d9f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1da00 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75  ->idx--;.    pCu
1da10 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1da20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
1da30 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
1da40 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1da50 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
1da60 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1da70 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1da80 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
1da90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1daa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1dab0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
1dac0 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
1dad0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1dae0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
1daf0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
1db00 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1db10 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
1db20 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
1db30 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
1db40 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
1db50 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
1db60 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1db70 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
1db80 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
1db90 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
1dba0 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
1dbb0 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
1dbc0 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
1dbd0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1dbe0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
1dbf0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
1dc00 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
1dc10 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
1dc20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1dc30 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
1dc40 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
1dc50 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1dc60 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
1dc70 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
1dc80 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
1dc90 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
1dca0 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
1dcb0 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
1dcc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1dcd0 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
1dce0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
1dcf0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1dd00 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
1dd10 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1dd20 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
1dd30 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
1dd40 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
1dd50 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
1dd60 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
1dd70 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
1dd80 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
1dd90 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
1dda0 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
1ddb0 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
1ddc0 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
1ddd0 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
1dde0 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
1ddf0 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
1de00 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
1de10 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
1de20 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
1de30 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
1de40 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
1de50 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
1de60 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1de70 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
1de80 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
1de90 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
1dea0 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
1deb0 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1dec0 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
1ded0 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
1dee0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1def0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1df00 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
1df10 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
1df20 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
1df30 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
1df40 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
1df50 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
1df60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1df70 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1df80 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
1df90 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1dfa0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
1dfb0 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
1dfc0 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
1dfd0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
1dfe0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1dff0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
1e000 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1e010 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
1e020 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e030 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e040 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
1e050 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1e060 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  ge1;.  n = get4b
1e070 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1e080 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
1e090 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
1e0a0 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
1e0b0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
1e0c0 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
1e0d0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
1e0e0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
1e0f0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
1e100 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
1e110 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
1e120 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
1e130 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
1e140 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
1e150 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
1e160 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
1e170 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
1e180 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
1e190 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
1e1a0 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
1e1b0 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
1e1c0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
1e1d0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
1e1e0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
1e1f0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
1e200 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
1e210 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e220 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1e230 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
1e240 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  by<=pagerPagecou
1e250 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1e260 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1e270 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1e280 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1e290 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1e2a0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1e2b0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1e2c0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1e2d0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1e2e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e2f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1e300 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1e310 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1e320 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1e330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e340 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1e350 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1e360 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1e370 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1e380 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1e390 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1e3a0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1e3b0 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1e3c0 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1e3d0 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1e3e0 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1e3f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e400 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1e410 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1e420 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e430 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1e440 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e450 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1e460 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1e470 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1e480 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1e490 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1e4a0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1e4b0 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1e4c0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1e4d0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1e4e0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1e4f0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1e500 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1e510 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1e520 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1e530 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1e540 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1e550 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1e560 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1e570 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1e580 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1e590 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1e5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e5b0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1e5c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e5d0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1e5e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e5f0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1e600 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
1e610 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
1e620 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1e630 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1e640 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1e650 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1e660 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
1e670 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1e680 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
1e690 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
1e6a0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
1e6b0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1e6c0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
1e6d0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
1e6e0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
1e6f0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
1e700 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
1e710 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
1e720 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
1e730 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
1e740 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
1e750 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
1e760 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
1e770 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
1e780 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e790 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1e7a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e7b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e7c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e7d0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e7e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
1e7f0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
1e800 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1e810 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1e820 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1e830 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1e840 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1e850 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
1e860 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1e870 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1e880 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1e890 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1e8a0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1e8b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1e8c0 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
1e8d0 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
1e8e0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
1e8f0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
1e900 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
1e910 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1e920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e930 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e940 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1e950 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
1e960 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e970 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1e980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1e990 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
1e9a0 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
1e9b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
1e9c0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
1e9d0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
1e9e0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
1e9f0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
1ea00 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
1ea10 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
1ea20 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
1ea30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1ea40 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1ea50 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
1ea60 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1ea70 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1ea80 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1ea90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1eaa0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1eab0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1eac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1ead0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1eae0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1eaf0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1eb00 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
1eb10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1eb20 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1eb40 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1eb50 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1eb60 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1eb70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1eb80 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1eb90 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
1eba0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1ebb0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1ebc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ebd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ebe0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1ebf0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
1ec00 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1ec10 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
1ec20 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
1ec30 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
1ec40 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
1ec50 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
1ec60 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
1ec70 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
1ec80 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
1ec90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1eca0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
1ecb0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
1ecc0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
1ecd0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1ece0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
1ecf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1ed00 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1ed10 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
1ed20 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
1ed30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ed40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ed50 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1ed60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1ed70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1ed80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ed90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1eda0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
1edb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1edc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1edd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ede0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1edf0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1ee00 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1ee10 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1ee20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ee30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1ee40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1ee50 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1ee60 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1ee70 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
1ee80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
1ee90 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
1eea0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1eeb0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
1eec0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
1eed0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
1eee0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1eef0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
1ef00 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1ef10 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1ef20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1ef30 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1ef40 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
1ef50 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1ef60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1ef70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1ef80 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
1ef90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1efa0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
1efc0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1efd0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1efe0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1eff0 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
1f000 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1f010 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1f020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f030 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
1f040 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1f050 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1f060 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1f070 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1f080 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1f090 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1f0a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1f0b0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
1f0c0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
1f0d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
1f0e0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
1f0f0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
1f100 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1f110 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
1f120 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
1f130 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f140 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1f150 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f160 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1f170 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f180 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1f1a0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
1f1b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
1f1c0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1f1d0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1f1e0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
1f1f0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
1f200 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1f210 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
1f220 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
1f230 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1f240 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
1f250 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
1f260 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
1f270 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
1f280 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1f290 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
1f2a0 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
1f2b0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
1f2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f2d0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
1f2e0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
1f2f0 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
1f300 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1f310 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f320 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1f330 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1f340 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
1f350 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1f360 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
1f370 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
1f380 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
1f390 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
1f3a0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
1f3b0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
1f3c0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
1f3d0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67       nPage = pag
1f3e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1f3f0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
1f400 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e      if( *pPgno>n
1f410 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
1f420 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65      /* Free page
1f430 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1f440 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
1f450 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1f460 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1f480 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1f490 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1f4a0 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  }.          TRAC
1f4b0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1f4c0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
1f4d0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
1f500 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
1f510 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
1f520 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
1f530 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
1f540 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
1f550 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
1f560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f570 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
1f580 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
1f590 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
1f5a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f5b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
1f5c0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1f5d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f5e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1f5f0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
1f600 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20  pPage, 1);.     
1f610 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f630 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f640 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28  erDontRollback((
1f650 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
1f660 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f670 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f680 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1f690 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f6a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1f6b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f6c0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
1f6d0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1f6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f6f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f700 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1f710 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1f720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
1f730 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1f740 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
1f750 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
1f760 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
1f770 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1f780 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1f790 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
1f7a0 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
1f7b0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
1f7c0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
1f7d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
1f7e0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
1f7f0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1f800 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1f810 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20   *pPgno = nPage 
1f820 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
1f830 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f840 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1f850 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
1f860 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63    /* An incr-vac
1f870 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20  uum has already 
1f880 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  run within this 
1f890 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
1f8a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  the.      ** pag
1f8b0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73  e to allocate is
1f8c0 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68   not from the ph
1f8d0 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68  ysical end of th
1f8e0 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20  e file, but.    
1f8f0 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72    ** at pBt->nTr
1f900 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  unc. .      */. 
1f910 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42       *pPgno = pB
1f920 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20  t->nTrunc+1;.   
1f930 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
1f940 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f950 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
1f960 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
1f970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f980 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1f990 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
1f9a0 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
1f9b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1f9c0 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
1f9d0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
1f9e0 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
1f9f0 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
1fa00 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
1fa10 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
1fa20 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
1fa30 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
1fa40 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
1fa50 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
1fa60 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
1fa70 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
1fa80 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
1fa90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
1faa0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1fab0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
1fac0 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
1fad0 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
1fae0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
1faf0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1fb00 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fb10 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50  t) );.      (*pP
1fb20 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66  gno)++;.      if
1fb30 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
1fb40 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1fb50 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20   ){ (*pPgno)++; 
1fb60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1fb70 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
1fb80 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63       pBt->nTrunc
1fb90 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d   = *pPgno;.    }
1fba0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
1fbb0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1fbc0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1fbd0 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
1fbe0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1fbf0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
1fc00 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
1fc10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1fc20 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
1fc30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fc40 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1fc50 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1fc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fc70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1fc80 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
1fc90 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1fca0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
1fcb0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
1fcc0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
1fcd0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1fce0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1fcf0 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
1fd00 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
1fd10 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1fd20 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
1fd30 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
1fd40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fd50 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20  *.** Add a page 
1fd60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1fd70 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65  file to the free
1fd80 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  list..**.** sqli
1fd90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1fda0 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f  is NOT called fo
1fdb0 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
1fdc0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
1fdd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1fde0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1fdf0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1fe00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1fe10 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1fe20 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a    int rc, n, k;.
1fe30 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68  .  /* Prepare th
1fe40 65 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69  e page for freei
1fe50 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ng */.  assert( 
1fe60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1fe70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1fe80 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1fe90 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
1fea0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   );.  pPage->isI
1feb0 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nit = 0;.  relea
1fec0 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50  sePage(pPage->pP
1fed0 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d  arent);.  pPage-
1fee0 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20  >pParent = 0;.. 
1fef0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1ff00 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
1ff10 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
1ff20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ff30 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1ff40 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1ff50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ff60 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
1ff70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1ff80 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
1ff90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1ffa0 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66  ], n+1);..#ifdef
1ffb0 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1ffc0 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68  ELETE.  /* If th
1ffd0 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  e SQLITE_SECURE_
1ffe0 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74  DELETE compile-t
1fff0 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ime option is en
20000 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  abled, then.  **
20010 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
20020 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
20030 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
20040 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72   zeros..  */.  r
20050 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20060 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
20070 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
20080 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
20090 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
200a0 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
200b0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65  t->pageSize);.#e
200c0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
200d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
200e0 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65  CUUM.  /* If the
200f0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
20100 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
20110 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
20120 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
20130 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
20140 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
20150 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
20160 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
20170 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
20180 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
20190 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52  pPage->pgno, PTR
201a0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29  MAP_FREEPAGE, 0)
201b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
201c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
201d0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30  ndif..  if( n==0
201e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
201f0 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72 65  is the first fre
20200 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63  e page */.    rc
20210 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20220 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
20230 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20240 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20250 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
20260 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20  aData, 0, 8);.  
20270 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
20280 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70  e1->aData[32], p
20290 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
202a0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
202b0 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c  GE: %d first\n",
202c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
202d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
202e0 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65 73  Other free pages
202f0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
20300 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69 72   Retrive the fir
20310 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
20320 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65    ** of the free
20330 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75  list and find ou
20340 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65  t how many leave
20350 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20  s it has. */.   
20360 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
20370 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20380 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
20390 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
203a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
203b0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
203c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
203d0 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67  rn rc;.    k = g
203e0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
203f0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
20400 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62  if( k>=pBt->usab
20410 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
20420 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
20430 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72  nk is full.  Tur
20440 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  n the page being
20450 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65   freed into a ne
20460 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b  w.      ** trunk
20470 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65   page with no le
20480 61 76 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  aves..      **. 
20490 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
204a0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
204b0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
204c0 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
204d0 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
204e0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
204f0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
20500 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
20510 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
20520 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
20530 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
20540 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
20550 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
20560 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
20570 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
20580 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
20590 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
205a0 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
205b0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
205c0 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
205d0 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
205e0 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
205f0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
20600 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
20610 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
20620 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
20630 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
20640 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
20650 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74  e will contain t
20660 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
20670 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
20680 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
20690 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
206a0 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
206b0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
206c0 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
206d0 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
206e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
206f0 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
20700 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
20710 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
20720 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
20730 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
20740 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
20750 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
20760 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
20770 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
20780 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20790 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
207a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
207b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
207c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
207d0 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75  age->aData, pTru
207e0 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nk->pgno);.     
207f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20800 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
20810 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
20820 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20830 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
20840 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  no);.        TRA
20850 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
20860 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
20870 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
20880 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20890 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
208a0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
208b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
208c0 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20  e if( k<0 ){.   
208d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
208e0 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
208f0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  e{.      /* Add 
20900 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20  the newly freed 
20910 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f  page as a leaf o
20920 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
20930 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  unk */.      rc 
20940 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20950 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
20960 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
20970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20980 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20990 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
209a0 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20  [4], k+1);.     
209b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
209c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34  unk->aData[8+k*4
209d0 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
209e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
209f0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
20a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20a10 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
20a20 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e  e->pDbPage);.#en
20a30 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
20a40 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
20a50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
20a60 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
20a70 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
20a80 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
20a90 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
20aa0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
20ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20ac0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
20ad0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
20ae0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20af0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
20b00 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
20b10 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
20b20 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
20b30 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
20b40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20b50 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
20b60 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
20b70 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
20b80 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
20b90 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
20ba0 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
20bb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20bc0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
20bd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
20be0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
20bf0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
20c00 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
20c10 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
20c20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
20c30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
20c40 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
20c50 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
20c60 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
20c70 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
20c80 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
20c90 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
20ca0 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50  rflow]);.  ovflP
20cb0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
20cc0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
20cd0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
20ce0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
20cf0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
20d00 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
20d10 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
20d20 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
20d30 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
20d40 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
20d50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
20d60 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c  fl;.    if( ovfl
20d70 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50  Pgno==0 || ovflP
20d80 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
20d90 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
20da0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20db0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20dc0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
20dd0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
20de0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
20df0 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76  no, &pOvfl, (nOv
20e00 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67  fl==0)?0:&ovflPg
20e10 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
20e20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
20e30 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
20e40 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ovfl);.    sqlit
20e50 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
20e60 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
20e70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20e80 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
20e90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20ea0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
20eb0 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
20ec0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
20ed0 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
20ee0 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
20ef0 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
20f00 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
20f10 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
20f20 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
20f30 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
20f40 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
20f50 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
20f60 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
20f70 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
20f80 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
20f90 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
20fa0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
20fb0 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
20fc0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
20fd0 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
20fe0 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
20ff0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
21000 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
21010 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
21020 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
21030 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
21040 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
21050 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
21060 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
21070 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
21080 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
21090 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
210a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
210b0 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
210c0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
210d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
210e0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
210f0 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
21100 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
21110 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
21120 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
21130 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
21140 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
21150 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
21160 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
21170 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
21180 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
21190 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
211a0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
211d0 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
211e0 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
211f0 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21210 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
21220 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
21230 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
21240 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
21250 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
21260 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
21270 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
21280 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
21290 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
212a0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
212b0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
212c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
212d0 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
212e0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
212f0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
21300 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
21310 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
21320 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
21330 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21340 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
21350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
21360 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
21370 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
21380 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
21390 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
213a0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
213b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
213c0 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
213d0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
213e0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
213f0 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
21400 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
21410 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
21420 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
21430 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
21440 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
21450 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
21460 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
21470 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
21480 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
21490 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
214a0 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
214b0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
214c0 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
214d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
214e0 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a  .nData==nData+nZ
214f0 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ero );.  .  /* F
21500 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
21510 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
21520 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
21530 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
21540 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
21550 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
21560 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
21570 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
21580 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
21590 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70  d += nKey;.    p
215a0 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
215b0 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d  nSrc = nKey;.  }
215c0 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
215d0 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
215e0 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
215f0 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
21600 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
21610 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
21620 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
21630 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
21640 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
21650 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
21660 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
21670 73 45 78 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e  sExact = 0;.#ifn
21680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21690 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
216a0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
216b0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
216c0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
216d0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
216e0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
216f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21700 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
21710 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
21720 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
21730 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
21740 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
21750 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
21760 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
21770 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
21780 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
21790 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
217a0 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  Ovfl>1 ){.      
217b0 20 20 20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d      /* isExact =
217c0 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d   1; */.        }
217d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
217e0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
217f0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
21800 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
21810 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69  vfl, pgnoOvfl, i
21820 73 45 78 61 63 74 29 3b 0a 23 69 66 6e 64 65 66  sExact);.#ifndef
21830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21840 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
21850 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
21860 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
21870 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
21880 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
21890 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
218a0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
218b0 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
218c0 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
218d0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
218e0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
218f0 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
21900 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
21910 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
21920 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
21930 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
21940 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
21950 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
21960 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
21970 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
21980 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
21990 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
219a0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
219b0 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
219c0 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
219d0 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
219e0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
219f0 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
21a00 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65  nitialised value
21a10 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
21a20 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
21a30 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
21a40 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
21a50 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
21a60 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
21a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21a80 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
21a90 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
21aa0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
21ab0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
21ac0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
21ad0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
21ae0 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
21af0 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20  pgnoPtrmap);.   
21b00 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
21b10 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
21b20 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
21b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
21b40 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
21b50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
21b60 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
21b70 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
21b80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
21b90 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
21ba0 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
21bb0 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
21bc0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
21bd0 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
21be0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
21bf0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
21c00 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
21c10 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
21c20 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
21c30 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
21c40 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
21c50 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
21c60 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
21c70 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
21c80 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
21c90 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
21ca0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20   spaceLeft;.    
21cb0 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
21cc0 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
21cd0 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
21ce0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
21cf0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
21d00 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
21d10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21d20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
21d30 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
21d40 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
21d50 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
21d60 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
21d70 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
21d80 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
21d90 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
21da0 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
21db0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
21dc0 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
21dd0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
21de0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
21df0 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
21e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21e10 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21e20 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74   MemPage.pParent
21e30 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20   pointer on the 
21e40 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65  page whose numbe
21e50 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e  r is.** given in
21e60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
21e70 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d  ment so that Mem
21e80 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c  Page.pParent hol
21e90 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65  ds the.** pointe
21ea0 72 20 69 6e 20 74 68 65 20 74 68 69 72 64 20 61  r in the third a
21eb0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
21ec0 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50  ic int reparentP
21ed0 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  age(BtShared *pB
21ee0 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65  t, Pgno pgno, Me
21ef0 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e  mPage *pNewParen
21f00 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d  t, int idx){.  M
21f10 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20  emPage *pThis;. 
21f20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
21f30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
21f40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21f50 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
21f60 20 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72   assert( pNewPar
21f70 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ent!=0 );.  if( 
21f80 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
21f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
21fa0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
21fb0 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50 61 67  r!=0 );.  pDbPag
21fc0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
21fd0 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
21fe0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
21ff0 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
22000 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67 65  pThis = (MemPage
22010 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
22020 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
22030 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d  ;.    if( pThis-
22040 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20  >isInit ){.     
22050 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e   assert( pThis->
22060 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
22070 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
22080 67 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ge) );.      if(
22090 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21   pThis->pParent!
220a0 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20  =pNewParent ){. 
220b0 20 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73         if( pThis
220c0 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69  ->pParent ) sqli
220d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54  te3PagerUnref(pT
220e0 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44  his->pParent->pD
220f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
22100 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d  pThis->pParent =
22110 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   pNewParent;.   
22120 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
22130 72 52 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d  rRef(pNewParent-
22140 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
22150 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e   }.      pThis->
22160 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b  idxParent = idx;
22170 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22180 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
22190 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  Page);.  }..#ifn
221a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
221b0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
221c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
221d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
221e0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
221f0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
22200 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67  , pNewParent->pg
22210 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  no);.  }.#endif.
22220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22230 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  OK;.}..../*.** C
22240 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e  hange the pParen
22250 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c  t pointer of all
22260 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
22270 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b  ge to point back
22280 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a  .** to pPage..**
22290 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
222a0 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68  ds, for every ch
222b0 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e  ild of pPage, in
222c0 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67  voke reparentPag
222d0 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73  e().** to make s
222e0 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68  ure that each ch
222f0 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70  ild knows that p
22300 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65  Page is its pare
22310 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
22320 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
22330 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d  ed after you mem
22340 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69  cpy() one page i
22350 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a  nto.** another..
22360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
22370 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
22380 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
22390 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53  {.  int i;.  BtS
223a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
223b0 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72  ge->pBt;.  int r
223c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
223d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
223e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
223f0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
22400 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
22410 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20 53 51  leaf ) return SQ
22420 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28  LITE_OK;..  for(
22430 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
22440 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
22450 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
22460 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
22470 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
22480 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
22490 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65  te(pCell), pPage
224a0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , i);.    if( rc
224b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
224c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
224d0 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65  c = reparentPage
224e0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
224f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
22500 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
22510 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
22520 20 20 20 20 20 20 20 20 70 50 61 67 65 2c 20 69          pPage, i
22530 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  );.  pPage->idxS
22540 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  hift = 0;.  retu
22550 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22560 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
22570 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
22580 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
22590 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
225a0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
225b0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
225c0 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
225d0 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
225e0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
225f0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
22600 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
22610 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
22620 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
22630 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
22640 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
22650 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
22660 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
22670 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
22680 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
22690 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
226a0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
226b0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
226c0 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
226d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
226e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
226f0 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
22700 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
22710 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
22720 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
22730 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
22740 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
22750 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
22760 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
22770 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
22780 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
22790 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
227a0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
227b0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
227c0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
227d0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
227e0 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
227f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
22800 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
22810 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
22820 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22830 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
22840 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
22850 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
22860 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
22870 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
22880 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
22890 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
228a0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73  byte(ptr);.  ass
228b0 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70 63  ert( pc>10 && pc
228c0 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz<=pPage->pBt-
228d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
228e0 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
228f0 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72  , pc, sz);.  for
22900 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
22910 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
22920 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
22930 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
22940 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
22950 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
22960 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
22970 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
22980 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
22990 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
229a0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
229b0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68  ;.  pPage->idxSh
229c0 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ift = 1;.}../*.*
229d0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
229e0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
229f0 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
22a00 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
22a10 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
22a20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
22a30 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
22a40 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
22a50 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
22a60 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
22a70 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
22a80 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
22a90 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
22aa0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
22ab0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
22ac0 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
22ad0 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
22ae0 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
22af0 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
22b00 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
22b10 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
22b20 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
22b30 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
22b40 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
22b50 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
22b60 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
22b70 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
22b80 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
22b90 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
22ba0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
22bb0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
22bc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
22bd0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
22be0 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
22bf0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
22c00 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
22c10 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
22c20 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
22c30 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
22c40 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
22c50 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
22c60 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
22c70 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
22c80 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
22c90 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
22ca0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
22cb0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
22cc0 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
22cd0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
22ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22cf0 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
22d00 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
22d10 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
22d20 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
22d30 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
22d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
22d50 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
22d60 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
22d70 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
22d80 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
22d90 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
22da0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
22db0 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
22dc0 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
22dd0 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
22de0 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
22df0 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
22e00 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
22e10 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
22e20 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20  /.  u8 nSkip    
22e30 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
22e40 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
22e50 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
22e60 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  he cell */.){.  
22e70 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
22e80 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
22e90 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
22ea0 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
22eb0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
22ec0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22ed0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
22ee0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
22ef0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f  First byte of co
22f00 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65  ntent for any ce
22f10 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ll in data[] */.
22f20 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
22f30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
22f40 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
22f50 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
22f60 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
22f70 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
22f80 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
22f90 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
22fa0 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
22fb0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ted */.  int hdr
22fc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
22fd0 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d  fset into data[]
22fe0 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61   of the page hea
22ff0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
23000 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
23010 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
23020 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
23030 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
23040 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
23050 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
23060 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
23070 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
23080 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
23090 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
230a0 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
230b0 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
230c0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
230d0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
230e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
230f0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
23100 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
23110 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  pCell) );.  asse
23120 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
23130 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
23140 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
23150 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
23160 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
23170 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
23180 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
23190 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
231a0 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
231b0 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
231c0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
231d0 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  mp;.    }.    j 
231e0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
231f0 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
23200 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65  ( j<sizeof(pPage
23210 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
23220 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
23230 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
23240 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
23250 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
23260 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
23270 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   i;.    pPage->n
23280 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
23290 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
232a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
232b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
232c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
232d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
232e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
232f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
23300 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
23310 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
23320 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
23330 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
23340 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  a;.    hdr = pPa
23350 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
23360 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
23370 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
23380 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
23390 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
233a0 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
233b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
233c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a  age->nCell + 2;.
233d0 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
233e0 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
233f0 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20  if( end > top - 
23400 73 7a 20 29 7b 0a 20 20 20 20 20 20 64 65 66 72  sz ){.      defr
23410 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
23420 29 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67  );.      top = g
23430 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
23440 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
23450 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
23460 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
23470 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
23480 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
23490 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
234a0 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
234b0 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
234c0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
234d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
234e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
234f0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20  e->nFree -= 2;. 
23500 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
23510 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
23520 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
23530 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e  p);.    for(j=en
23540 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a  d-2, ptr=&data[j
23550 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20  ]; j>ins; j-=2, 
23560 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70  ptr-=2){.      p
23570 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b  tr[0] = ptr[-2];
23580 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  .      ptr[1] = 
23590 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[-1];.    }. 
235a0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
235b0 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
235c0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
235d0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
235e0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
235f0 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b  e->idxShift = 1;
23600 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23610 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
23620 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
23630 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
23640 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
23650 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
23660 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
23670 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
23680 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
23690 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
236a0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
236b0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
236c0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
236d0 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e   */.      CellIn
236e0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73  fo info;.      s
236f0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
23700 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
23710 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
23720 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
23730 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
23740 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
23750 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
23760 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  oad );.      if(
23770 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
23780 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
23790 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
237a0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
237b0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
237c0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
237d0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
237e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
237f0 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
23800 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  >pBt, pgnoOvfl, 
23810 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
23820 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
23830 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23840 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
23850 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
23860 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23870 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23880 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
23890 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
238a0 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
238b0 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
238c0 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
238d0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
238e0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
238f0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
23900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23910 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
23920 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
23930 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
23940 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
23950 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
23960 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
23970 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
23980 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
23990 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
239a0 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
239b0 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
239c0 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
239d0 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
239e0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
239f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
23a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
23a10 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
23a20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20  int totalSize;  
23a30 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
23a40 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
23a50 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
23a60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
23a70 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
23a80 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20   int cellptr;   
23a90 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
23aa0 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
23ab0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
23ac0 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
23ad0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
23ae0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
23af0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
23b00 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   Data for the pa
23b10 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
23b20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
23b30 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
23b40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23b50 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
23b60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f 74  >mutex) );.  tot
23b70 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f  alSize = 0;.  fo
23b80 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
23b90 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53  i++){.    totalS
23ba0 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ize += aSize[i];
23bb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
23bc0 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c  otalSize+2*nCell
23bd0 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  <=pPage->nFree )
23be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
23bf0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
23c00 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
23c10 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
23c20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
23c30 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
23c40 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
23c50 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
23c60 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
23c70 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20    if( nCell ){. 
23c80 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c     cellbody = al
23c90 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
23ca0 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  e, totalSize);. 
23cb0 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
23cc0 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ody>0 );.    ass
23cd0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
23ce0 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a  e >= 2*nCell );.
23cf0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
23d00 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20   -= 2*nCell;.   
23d10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
23d20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
23d30 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
23d40 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
23d50 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
23d60 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
23d70 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
23d80 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c  e[i]);.      cel
23d90 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20  lptr += 2;.     
23da0 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69   cellbody += aSi
23db0 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ze[i];.    }.   
23dc0 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
23dd0 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  y==pPage->pBt->u
23de0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d  sableSize );.  }
23df0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
23e00 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nCell;.}../*.*
23e10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23e20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
23e30 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
23e40 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
23e50 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
23e60 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
23e70 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
23e80 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
23e90 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
23ea0 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
23eb0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
23ec0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
23ed0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
23ee0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
23ef0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
23f00 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
23f10 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
23f20 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
23f30 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
23f40 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
23f50 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
23f60 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
23f70 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
23f80 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
23f90 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
23fa0 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
23fb0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
23fc0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
23fd0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
23fe0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
23ff0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
24000 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
24010 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
24020 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
24030 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
24040 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
24050 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
24060 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
24070 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
24080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24090 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
240a0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
240b0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
240c0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
240d0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
240e0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
240f0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
24100 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
24110 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
24120 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
24130 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e  ge*, int);..#ifn
24140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24150 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
24160 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
24170 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
24180 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
24190 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
241a0 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
241b0 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
241c0 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
241d0 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
241e0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
241f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
24200 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
24210 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
24220 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
24230 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
24240 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
24250 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68  rying balance th
24260 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
24270 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
24280 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
24290 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
242a0 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
242b0 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
242c0 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
242d0 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
242e0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
242f0 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
24300 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
24310 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
24320 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
24330 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
24340 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
24350 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
24360 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
24370 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
24380 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
24390 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
243a0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
243b0 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
243c0 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
243d0 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
243e0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
243f0 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
24400 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
24410 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
24420 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
24430 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
24440 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
24450 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
24460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24470 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
24480 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65  mPage *pPage, Me
24490 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b  mPage *pParent){
244a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
244b0 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67  Page *pNew;.  Pg
244c0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
244d0 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73   *pCell;.  u16 s
244e0 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
244f0 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72  o info;.  BtShar
24500 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
24510 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
24520 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
24530 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
24540 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
24550 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
24560 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
24590 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
245a0 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
245b0 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
245c0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
245d0 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
245e0 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73  er cell */..  as
245f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24600 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
24610 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
24620 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
24630 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
24640 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
24650 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
24660 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
24670 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
24680 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
24690 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
246a0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
246b0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
246c0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
246d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
246e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
246f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65  rn rc;.  }.  pCe
24700 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66  ll = pPage->aOvf
24710 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a  l[0].pCell;.  sz
24720 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
24730 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
24740 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65  ;.  zeroPage(pNe
24750 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  w, pPage->aData[
24760 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50  0]);.  assembleP
24770 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
24780 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20  ell, &szCell);. 
24790 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
247a0 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  w = 0;..  /* Set
247b0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
247c0 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
247d0 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65  ed page to pPare
247e0 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70  nt. */.  pNew->p
247f0 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
24800 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
24810 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
24820 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  Page);..  /* pPa
24830 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
24840 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
24850 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
24860 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20  ge this.  ** so 
24870 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63  that the right-c
24880 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20  hild is the new 
24890 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  page allocated a
248a0 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50  bove and.  ** pP
248b0 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
248c0 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
248d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 67 6e 6f 72  .  **.  ** Ignor
248e0 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
248f0 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20 74  ue of the call t
24900 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20  o fillInCell(). 
24910 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20 2a  fillInCell().  *
24920 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75 72  * may only retur
24930 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  n other than SQL
24940 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69 73 20  ITE_OK if it is 
24950 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 6c 6f  required to allo
24960 63 61 74 65 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72  cate.  ** one or
24970 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
24980 61 67 65 73 2e 20 53 69 6e 63 65 20 61 6e 20 69  ages. Since an i
24990 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d  nternal table B-
249a0 54 72 65 65 20 63 65 6c 6c 20 0a 20 20 2a 2a 20  Tree cell .  ** 
249b0 6d 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20  may never spill 
249c0 6f 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65  over onto an ove
249d0 72 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69  rflow page (it i
249e0 73 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a  s a maximum of .
249f0 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69 6e    ** 13 bytes in
24a00 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f   size), it is no
24a10 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f 20  t neccessary to 
24a20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
24a30 20 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   code..  **.  **
24a40 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
24a50 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e  insertCell() fun
24a60 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
24a70 6c 20 69 66 20 74 68 65 20 70 61 67 65 0a 20 20  l if the page.  
24a80 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  ** being inserte
24a90 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64  d into is alread
24aa0 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74  y writable and t
24ab0 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
24ac0 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61   .  ** contain a
24ad0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e 74  n overflow point
24ae0 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  er. So ignore th
24af0 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  is return code t
24b00 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  oo..  */.  asser
24b10 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
24b20 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  0 );.  pCell = f
24b30 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
24b40 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
24b50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
24b60 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
24b70 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
24b80 0a 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50  .  fillInCell(pP
24b90 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c  arent, parentCel
24ba0 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
24bb0 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e   0, 0, 0, &paren
24bc0 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
24bd0 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20  ( parentSize<64 
24be0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
24bf0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
24c00 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
24c10 62 50 61 67 65 29 20 29 3b 0a 20 20 69 6e 73 65  bPage) );.  inse
24c20 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
24c30 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e  parentIdx, paren
24c40 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a  tCell, parentSiz
24c50 65 2c 20 30 2c 20 34 29 3b 0a 20 20 70 75 74 34  e, 0, 4);.  put4
24c60 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
24c70 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61  wCell(pParent,pa
24c80 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d  rentIdx), pPage-
24c90 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79  >pgno);.  put4by
24ca0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
24cb0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
24cc0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
24cd0 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  w);..#ifndef SQL
24ce0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24cf0 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  UUM.  /* If this
24d00 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
24d10 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
24d20 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
24d30 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e  map.  ** with en
24d40 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
24d50 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
24d60 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
24d70 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74   .  ** cell on t
24d80 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
24d90 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
24da0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
24db0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
24dc0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
24dd0 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
24de0 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
24df0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  t->pgno);.    if
24e00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24e10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
24e20 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
24e30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
24e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24e50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
24e60 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
24e70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24e80 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
24e90 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
24ea0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
24eb0 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20  he new page and 
24ec0 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
24ed0 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e  nt page,.  ** in
24ee0 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65   case the divide
24ef0 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  r cell inserted 
24f00 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63  caused it to bec
24f10 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20  ome overfull..  
24f20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  */.  releasePage
24f30 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  (pNew);.  return
24f40 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74   balance(pParent
24f50 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  , 0);.}.#endif /
24f60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
24f70 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f  ICKBALANCE */../
24f80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24f90 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
24fa0 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61  Cells on pPage a
24fb0 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69  nd up to NN*2 si
24fc0 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61  blings.** of pPa
24fd0 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  ge so that all p
24fe0 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
24ff0 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  the same amount 
25000 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a  of free space..*
25010 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62  * Usually NN sib
25020 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20  lings on either 
25030 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73  side of pPage is
25040 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
25050 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67  ancing,.** thoug
25060 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  h more siblings 
25070 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
25080 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67  one side if pPag
25090 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  e is the first.*
250a0 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  * or last child 
250b0 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  of its parent.  
250c0 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77  If pPage has few
250d0 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62  er than 2*NN sib
250e0 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68  lings.** (someth
250f0 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
25100 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61  ly happen if pPa
25110 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
25120 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69  age or a .** chi
25130 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e  ld of root) then
25140 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
25150 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70  iblings particip
25160 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
25170 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
25180 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
25190 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68  gs of pPage migh
251a0 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
251b0 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
251c0 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20  ne or.** two in 
251d0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
251e0 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
251f0 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
25200 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20   full. The root 
25210 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69  page.** is speci
25220 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65  al and is allowe
25230 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65  d to be nearly e
25240 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69  mpty. If pPage i
25250 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s .** the root p
25260 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  age, then the de
25270 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
25280 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
25290 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73  ed.** or decreas
252a0 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65  ed by one, as ne
252b0 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70  cessary, to keep
252c0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66   the root page f
252d0 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65  rom being.** ove
252e0 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74  rfull or complet
252f0 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  ely empty..**.**
25300 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
25310 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
25320 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
25330 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  the Cells on pPa
25340 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
25350 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
25360 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ed in pPage->aDa
25370 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20  ta[].  This can 
25380 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
25390 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
253a0 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20  l.  Part of the 
253b0 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
253c0 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b  ine is to.** mak
253d0 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73  e sure all Cells
253e0 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20   for pPage once 
253f0 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61  again fit in pPa
25400 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a  ge->aData[]..**.
25410 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
25420 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
25430 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  e siblings of pP
25440 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  age, the parent 
25450 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  of pPage.** migh
25460 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  t become overful
25470 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
25480 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   If that happens
25490 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
254a0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
254b0 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
254c0 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  the parent..**.*
254d0 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
254e0 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
254f0 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
25500 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
25510 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
25520 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f  upted state.  So
25530 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
25540 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
25550 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
25560 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
25570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
25580 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d  ance_nonroot(Mem
25590 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
255a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
255b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
255c0 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  The parent of pP
255d0 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
255e0 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
255f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
25600 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
25610 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25630 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
25640 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
25650 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
25660 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
25670 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
25680 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
25690 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
256a0 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
256c0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
256d0 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
256e0 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25700 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
25710 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
25720 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20  int nDiv;       
25730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25740 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
25750 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20  in apDiv[] */.  
25760 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25780 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
25790 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67  /* Index of pPag
257c0 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  e in pParent->aC
257d0 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
257e0 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
257f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
25800 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
25810 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
25820 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25840 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
25850 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   code */.  int l
25860 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
25870 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
25880 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
25890 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
258a0 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
258c0 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
258d0 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
258e0 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
258f0 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
25900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25910 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
25920 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
25930 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
25940 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
25950 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
25960 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
25970 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
25980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25990 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
259a0 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
259b0 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
259c0 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
259e0 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
259f0 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
25a00 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32 20  /.  int iSpace2 
25a10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
25a20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
25a30 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 32   byte of aSpace2
25a40 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
25a50 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
25a60 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
25a70 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
25a80 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
25a90 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
25aa0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
25ab0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
25ac0 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
25ad0 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d  Pgno pgnoOld[NB]
25ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25af0 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
25b00 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
25b10 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  Old[] */.  MemPa
25b20 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
25b30 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
25b40 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
25b50 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
25b60 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
25b70 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
25b80 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
25b90 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
25ba0 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
25bb0 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42   Pgno pgnoNew[NB
25bc0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  +2];          /*
25bd0 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
25be0 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
25bf0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  pNew[] */.  u8 *
25c00 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  apDiv[NB];      
25c10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
25c20 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
25c30 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
25c40 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
25c50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25c60 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
25c70 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
25c80 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
25c90 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
25ca0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
25cb0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
25cc0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
25cd0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
25ce0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
25cf0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
25d00 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
25d10 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
25d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25d30 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
25d40 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
25d50 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
25d60 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20   *aCopy[NB];    
25d70 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
25d80 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f  r holding data o
25d90 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20  f apCopy[] */.  
25da0 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
25db0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
25dc0 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
25dd0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66  viders cells bef
25de0 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20  ore balance */. 
25df0 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30   u8 *aSpace2 = 0
25e00 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65  ;       /* Space
25e10 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69   for overflow di
25e20 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74  viders cells aft
25e30 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 23 69  er balance */.#i
25e40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25e50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75  T_AUTOVACUUM.  u
25e60 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  8 *aFrom = 0;.#e
25e70 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
25e80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25e90 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
25ea0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a  utex) );..  /* .
25eb0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61    ** Find the pa
25ec0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  rent page..  */.
25ed0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25ee0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
25ef0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
25f00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
25f10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20  ge->pDbPage) || 
25f20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
25f30 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ==1 );.  pBt = p
25f40 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
25f50 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
25f60 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  arent;.  assert(
25f70 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
25f80 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
25f90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25fa0 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
25fb0 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
25fc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
25fd0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
25fe0 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
25ff0 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
26000 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
26010 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23  rent->pgno));..#
26020 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26030 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
26040 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63    /*.  ** A spec
26050 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20  ial case:  If a 
26060 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75  new entry has ju
26070 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
26080 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62   into a.  ** tab
26090 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62  le (that is, a b
260a0 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65  tree with intege
260b0 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64  r keys and all d
260c0 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65  ata at the leave
260d0 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  s).  ** and the 
260e0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65  new entry is the
260f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
26100 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69  y in the tree (i
26110 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c  t has the.  ** l
26120 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e  argest key) then
26130 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
26140 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
26150 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a   routine for.  *
26160 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61  * balancing.  ba
26170 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
26180 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64   much faster and
26190 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69   results in a ti
261a0 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69  ghter.  ** packi
261b0 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  ng of data in th
261c0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
261d0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
261e0 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70  >leaf &&.      p
261f0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a  Page->intKey &&.
26200 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
26210 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20  erflow==1 &&.   
26220 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
26230 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
26240 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50  Cell &&.      pP
26250 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67  age->pParent->pg
26260 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67  no!=1 &&.      g
26270 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
26280 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
26290 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
262a0 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b  pPage->pgno.  ){
262b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
262c0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
262d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    /*.    ** TODO
262e0 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c  : Check the sibl
262f0 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ings to the left
26300 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61   of pPage. It ma
26310 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  y be that.    **
26320 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75   they are not fu
26330 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61  ll and no new pa
26340 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ge is required..
26350 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
26360 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  n balance_quick(
26370 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
26380 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
26390 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
263a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
263b0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
263c0 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65  Page)) ){.    re
263d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
263e0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
263f0 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72   cell in the par
26400 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c  ent page whose l
26410 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73  eft child points
26420 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50   back.  ** to pP
26430 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22 20  age.  The "idx" 
26440 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20  variable is the 
26450 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 65  index of that ce
26460 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20  ll.  If pPage.  
26470 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74 6d  ** is the rightm
26480 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
26490 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64  rent then set id
264a0 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43  x to pParent->nC
264b0 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ell .  */.  if( 
264c0 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66  pParent->idxShif
264d0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
264e0 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70  no;.    pgno = p
264f0 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  Page->pgno;.    
26500 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71  assert( pgno==sq
26510 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
26520 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
26530 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  age) );.    for(
26540 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72 65  idx=0; idx<pPare
26550 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b  nt->nCell; idx++
26560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65 74  ){.      if( get
26570 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
26580 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70  Parent, idx))==p
26590 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 62  gno ){.        b
265a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
265b0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
265c0 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
265d0 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ll.             
265e0 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  || get4byte(&pPa
265f0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
26600 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
26610 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65  ])==pgno );.  }e
26620 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20 70  lse{.    idx = p
26630 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
26640 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
26650 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69 61  Initialize varia
26660 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74 20  bles so that it 
26670 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f 20  will be safe to 
26680 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63 74  jump.  ** direct
26690 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c  ly to balance_cl
266a0 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d  eanup at any mom
266b0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64  ent..  */.  nOld
266c0 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73   = nNew = 0;.  s
266d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
266e0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
266f0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
26700 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  d sibling pages 
26710 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65  to pPage and the
26720 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
26730 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20  t that divide.  
26740 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  ** the siblings.
26750 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20    An attempt is 
26760 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
26770 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
26780 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20  er.  ** side of 
26790 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62  pPage.  More sib
267a0 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
267b0 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
267c0 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20  owever, if.  ** 
267d0 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20  pPage there are 
267e0 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
267f0 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
26800 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50  her side.  If pP
26810 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
26820 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
26830 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
26840 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
26850 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f   are taken..  */
26860 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d  .  nxDiv = idx -
26870 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76   NN;.  if( nxDiv
26880 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d   + NB > pParent-
26890 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78  >nCell ){.    nx
268a0 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Div = pParent->n
268b0 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20  Cell - NB + 1;. 
268c0 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30   }.  if( nxDiv<0
268d0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
268e0 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20  0;.  }.  nDiv = 
268f0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d  0;.  for(i=0, k=
26900 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b  nxDiv; i<NB; i++
26910 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , k++){.    if( 
26920 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  k<pParent->nCell
26930 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
26940 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
26950 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20  arent, k);.     
26960 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61   nDiv++;.      a
26970 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d  ssert( !pParent-
26980 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70  >leaf );.      p
26990 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
269a0 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
269b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d      }else if( k=
269c0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
269d0 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  ){.      pgnoOld
269e0 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  [i] = get4byte(&
269f0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
26a00 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
26a10 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
26a20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
26a30 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
26a40 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
26a50 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61  , pgnoOld[i], &a
26a60 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e 74  pOld[i], pParent
26a70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
26a80 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
26a90 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  anup;.    apOld[
26aa0 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  i]->idxParent = 
26ab0 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d  k;.    apCopy[i]
26ac0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
26ad0 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20  ( i==nOld );.   
26ae0 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61   nOld++;.    nMa
26af0 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
26b00 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
26b10 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
26b20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
26b30 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
26b40 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
26b50 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
26b60 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
26b70 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
26b80 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
26b90 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
26ba0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
26bb0 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
26bc0 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
26bd0 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
26be0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
26bf0 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
26c20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
26c30 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c50 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
26c60 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65    + (ROUND8(size
26c70 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74  of(MemPage))+pBt
26c80 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20  ->pageSize)*NB  
26c90 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
26ca0 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26cd0 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
26ce0 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
26cf0 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
26d00 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
26d10 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70  /* aFrom */.  ap
26d20 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
26d30 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
26d40 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
26d50 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
26d60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26d70 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
26d80 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
26d90 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
26da0 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
26db0 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
26dc0 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
26dd0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
26de0 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
26df0 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  0] - (u8*)apCell
26e00 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
26e10 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
26e20 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66   required */.  f
26e30 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
26e40 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
26e50 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
26e60 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
26e70 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
26e80 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
26e90 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
26ea0 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
26eb0 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
26ec0 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
26ed0 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
26ee0 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e  pace1 = &aCopy[N
26ef0 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  B-1][pBt->pageSi
26f00 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
26f10 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61  (MemPage))];.  a
26f20 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65 31  ssert( ((aSpace1
26f30 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
26f40 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
26f50 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
26f60 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64  equired */.#ifnd
26f70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26f80 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
26f90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26fa0 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26  ){.    aFrom = &
26fb0 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
26fc0 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64  eSize];.  }.#end
26fd0 69 66 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73  if.  aSpace2 = s
26fe0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
26ff0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  (pBt->pageSize);
27000 0a 20 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d  .  if( aSpace2==
27010 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
27020 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
27030 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
27040 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  anup;.  }.  .  /
27050 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69  *.  ** Make copi
27060 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  es of the conten
27070 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69  t of pPage and i
27080 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f  ts siblings into
27090 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68   aOld[]..  ** Th
270a0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
270b0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
270c0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
270d0 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a  opies rather.  *
270e0 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
270f0 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
27100 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
27110 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
27120 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f  e.  ** process o
27130 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
27140 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ten..  */.  for(
27150 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
27160 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
27170 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  p = apCopy[i] = 
27180 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b  (MemPage*)aCopy[
27190 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
271a0 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
271b0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
271c0 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f    p->aData = (vo
271d0 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d  id*)&p[1];.    m
271e0 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20  emcpy(p->aData, 
271f0 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
27200 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
27210 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27220 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
27230 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
27240 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
27250 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
27260 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
27270 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
27280 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
27290 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
272a0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
272b0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
272c0 20 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20   form aSpace1[] 
272d0 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
272e0 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
272f0 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
27300 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
27310 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
27320 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
27330 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
27340 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
27350 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
27360 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
27370 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
27380 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
27390 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
273a0 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
273b0 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
273c0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
273d0 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
273e0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
273f0 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
27400 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
27410 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
27420 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
27430 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
27440 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
27450 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
27460 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
27470 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
27480 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
27490 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
274a0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
274b0 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
274c0 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
274d0 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
274e0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
274f0 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
27500 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
27510 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
27520 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
27530 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
27540 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
27550 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b   pPage->hasData;
27560 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
27570 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
27580 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
27590 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
275a0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
275b0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
275c0 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
275d0 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
275e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
275f0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
27600 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
27610 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
27620 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
27630 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
27640 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
27650 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
27660 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e  ll[nCell]);.#ifn
27670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27680 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
27690 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
276a0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
276b0 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61  int a;.        a
276c0 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b  From[nCell] = i;
276d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
276e0 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
276f0 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
27700 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
27710 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
27720 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
27730 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
27740 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
27750 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
27760 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
27770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27780 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
27790 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
277a0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
277b0 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
277c0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
277d0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
277e0 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
277f0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
27800 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
27810 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
27820 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
27830 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
27840 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
27850 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
27860 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
27870 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
27880 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
27890 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
278a0 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
278b0 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
278c0 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
278d0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
278e0 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
278f0 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
27900 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
27910 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
27920 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
27930 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
27940 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
27950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27960 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
27970 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
27980 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
27990 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
279a0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
279b0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
279c0 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20  ce1[iSpace1];.  
279d0 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d        iSpace1 +=
279e0 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
279f0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
27a00 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
27a10 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
27a20 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce1<=pBt->pageSi
27a30 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
27a40 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
27a50 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
27a60 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
27a70 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
27a80 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66  rection;.#ifndef
27a90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
27aa0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
27ab0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
27ac0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
27ad0 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
27ae0 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a  0xFF;.        }.
27af0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64  #endif.        d
27b00 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
27b10 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
27b20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
27b30 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63  l] -= leafCorrec
27b40 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  tion;.        as
27b50 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70  sert( get4byte(p
27b60 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69  Temp)==pgnoOld[i
27b70 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ] );.        if(
27b80 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
27b90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27ba0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
27bb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
27bc0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
27bd0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
27be0 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
27bf0 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
27c00 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
27c10 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
27c20 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
27c30 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
27c40 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
27c50 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72  >aData[pOld->hdr
27c60 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20  Offset+8], 4);. 
27c70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27c80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27c90 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
27ca0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  4 );.          i
27cb0 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  f( szCell[nCell]
27cc0 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
27cd0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
27ce0 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
27cf0 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
27d00 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
27d10 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
27d20 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
27d30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27d40 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
27d50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
27d60 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
27d70 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
27d80 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
27d90 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
27da0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
27db0 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
27dc0 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
27dd0 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
27de0 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
27df0 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
27e00 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
27e10 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
27e20 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
27e30 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
27e40 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
27e50 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
27e60 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
27e70 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
27e80 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
27e90 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
27ea0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
27eb0 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
27ec0 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
27ed0 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
27ee0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
27ef0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
27f00 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
27f10 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
27f20 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
27f30 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
27f40 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
27f50 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
27f60 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
27f70 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
27f80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
27f90 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
27fa0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
27fb0 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
27fc0 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
27fd0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
27fe0 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
27ff0 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
28000 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
28010 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
28020 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
28030 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
28040 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
28050 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
28060 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
28070 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
28080 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
28090 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
280a0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
280b0 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
280c0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
280d0 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
280e0 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
280f0 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
28100 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
28110 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
28120 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
28130 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
28140 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
28150 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
28160 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
28170 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
28180 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
28190 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
281a0 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
281b0 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
281c0 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
281d0 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
281e0 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
281f0 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
28200 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
28210 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
28220 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
28230 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
28240 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
28250 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
28260 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
28270 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
28280 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
28290 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
282a0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
282b0 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
282c0 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
282d0 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
282e0 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
282f0 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
28300 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
28310 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
28320 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
28330 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
28340 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
28350 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
28360 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
28370 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
28380 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
28390 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
283a0 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
283b0 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
283c0 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
283d0 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
283e0 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
283f0 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
28400 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
28410 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
28420 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
28430 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
28440 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
28450 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
28460 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
28470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28480 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
28490 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
284a0 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
284b0 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
284c0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
284d0 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
284e0 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
284f0 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
28500 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
28510 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
28520 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
28530 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
28540 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
28550 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
28560 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
28570 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
28580 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
28590 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
285a0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
285b0 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
285c0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
285d0 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
285e0 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
285f0 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
28600 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
28610 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
28620 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
28630 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
28640 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
28650 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
28660 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20  or we are the.  
28670 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
28680 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
28690 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
286a0 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
286b0 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
286c0 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
286d0 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
286e0 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
286f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
28700 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
28710 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
28720 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
28730 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ==0) );..  /*.  
28740 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
28750 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
28760 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
28770 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
28780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
28790 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65  pgno>1 );.  page
287a0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61  Flags = pPage->a
287b0 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
287c0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
287d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
287e0 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
287f0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
28800 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
28810 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  d[i];.      pgno
28820 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64  New[i] = pgnoOld
28830 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
28840 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
28850 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28860 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
28870 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
28880 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
28890 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
288a0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
288b0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
288c0 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
288d0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
288e0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
288f0 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70  , &pgnoNew[i], p
28900 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b  gnoNew[i-1], 0);
28910 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
28920 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
28930 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
28940 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
28950 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d     nNew++;.    }
28960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
28970 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
28980 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
28990 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
289a0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
289b0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20  <nOld ){.    rc 
289c0 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64  = freePage(apOld
289d0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
289e0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
289f0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
28a00 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
28a10 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
28a20 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
28a30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
28a40 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
28a50 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
28a60 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
28a70 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
28a80 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
28a90 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
28aa0 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
28ab0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
28ac0 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
28ad0 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
28ae0 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
28af0 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
28b00 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
28b10 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
28b20 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
28b30 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
28b40 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
28b50 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
28b60 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
28b70 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
28b80 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
28b90 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
28ba0 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
28bb0 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
28bc0 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
28bd0 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
28be0 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
28bf0 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
28c00 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
28c10 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
28c20 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
28c30 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
28c40 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
28c50 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
28c60 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
28c70 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f   int minV = pgno
28c80 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  New[i];.    int 
28c90 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
28ca0 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
28cb0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67  +){.      if( pg
28cc0 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e  noNew[j]<(unsign
28cd0 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
28ce0 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
28cf0 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f       minV = pgno
28d00 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  New[j];.      }.
28d10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
28d20 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
28d30 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
28d40 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
28d50 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
28d60 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
28d70 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
28d80 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69  [i] = pgnoNew[mi
28d90 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
28da0 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
28db0 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
28dc0 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20  [minI] = t;.    
28dd0 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
28de0 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
28df0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28e00 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
28e10 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
28e20 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
28e30 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
28e40 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20  pgnoOld[0], .   
28e50 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f   nOld>=2 ? pgnoO
28e60 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ld[1] : 0,.    n
28e70 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=3 ? pgnoOld
28e80 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e  [2] : 0,.    pgn
28e90 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30  oNew[0], szNew[0
28ea0 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
28eb0 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c   pgnoNew[1] : 0,
28ec0 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
28ed0 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
28ee0 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32  w>=3 ? pgnoNew[2
28ef0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  ] : 0, nNew>=3 ?
28f00 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
28f10 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e     nNew>=4 ? pgn
28f20 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[3] : 0, nNe
28f30 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
28f40 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
28f50 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20   ? pgnoNew[4] : 
28f60 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
28f70 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
28f80 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
28f90 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
28fa0 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
28fb0 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
28fc0 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
28fd0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
28fe0 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
28ff0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
29000 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
29010 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
29020 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
29030 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
29040 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
29050 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
29060 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
29070 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
29080 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29090 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e  New->pgno==pgnoN
290a0 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72  ew[i] );.    zer
290b0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
290c0 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65  Flags);.    asse
290d0 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
290e0 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
290f0 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
29100 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
29110 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
29120 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
29130 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
29140 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
29150 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
29160 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29170 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
29180 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
29190 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
291a0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
291b0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
291c0 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
291d0 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
291e0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61  the siblings tha
291f0 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65  t were rearrange
29200 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a  d. These can be:
29210 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69   left.    ** chi
29220 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20  ldren of cells, 
29230 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
29240 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  of the page, or 
29250 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20  overflow pages. 
29260 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f     ** pointed to
29270 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a   by cells..    *
29280 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  /.    if( pBt->a
29290 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
292a0 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e     for(k=j; k<cn
292b0 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  tNew[i]; k++){. 
292c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
292d0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
292e0 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b        if( aFrom[
292f0 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  k]==0xFF || apCo
29300 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67  py[aFrom[k]]->pg
29310 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
29320 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
29330 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
29340 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20  New, k-j);.     
29350 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29370 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
29380 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
29390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
293a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
293b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20  #endif..    j = 
293c0 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
293d0 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
293e0 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
293f0 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
29400 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
29410 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
29420 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
29430 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
29440 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
29450 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d  .    if( i<nNew-
29460 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a  1 && j<nCell ){.
29470 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
29480 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
29490 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
294a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
294b0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
294c0 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
294d0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
294e0 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
294f0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
29500 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
29510 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20  ace2[iSpace2];. 
29520 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
29530 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
29540 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
29550 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
29560 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
29570 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
29580 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
29590 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
295a0 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
295b0 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
295c0 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
295d0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
295e0 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
295f0 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
29600 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
29610 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
29620 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
29630 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
29640 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
29650 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
29660 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
29670 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
29680 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
29690 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
296a0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
296b0 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
296c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
296d0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
296e0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
296f0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
29700 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
29710 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c         fillInCel
29720 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  l(pParent, pCell
29730 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
29740 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20  0, 0, 0, &sz);. 
29750 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
29760 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29770 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
29780 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62  4;.        /* Ob
29790 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e  scure case for n
297a0 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65  on-leaf-data tre
297b0 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  es: If the cell 
297c0 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20  at pCell was.   
297d0 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
297e0 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c  ly stored on a l
297f0 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74  eaf node, and it
29800 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20  s reported size 
29810 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a  was 4.        **
29820 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20   bytes, then it 
29830 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20  may actually be 
29840 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69  smaller than thi
29850 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73  s .        ** (s
29860 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ee sqlite3BtreeP
29870 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34  arseCellPtr(), 4
29880 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69   bytes is the mi
29890 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20  nimum size of.  
298a0 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c        ** any cel
298b0 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d  l). But it is im
298c0 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20  portant to pass 
298d0 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65  the correct size
298e0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   to .        ** 
298f0 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f  insertCell(), so
29900 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c   reparse the cel
29910 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  l now..        *
29920 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74  *.        ** Not
29930 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20  e that this can 
29940 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20  never happen in 
29950 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66  an SQLite data f
29960 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20  ile, as all.    
29970 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65      ** cells are
29980 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
29990 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65  s. It only happe
299a0 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73  ns in b-trees us
299b0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ed.        ** to
299c0 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53   evaluate "IN (S
299d0 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20  ELECT ...)" and 
299e0 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e  similar clauses.
299f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29a00 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a      if( szCell[j
29a10 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==4 ){.        
29a20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72    assert(leafCor
29a30 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20  rection==4);.   
29a40 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
29a50 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
29a60 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pCell);.       
29a70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
29a80 20 69 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a   iSpace2 += sz;.
29a90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
29aa0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
29ab0 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4 );.      asser
29ac0 74 28 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d  t( iSpace2<=pBt-
29ad0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
29ae0 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
29af0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
29b00 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
29b10 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  emp, 4);.      i
29b20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29b30 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
29b40 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70  cleanup;.      p
29b50 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
29b60 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
29b70 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70  ,nxDiv), pNew->p
29b80 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
29b90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
29ba0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
29bb0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
29bc0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
29bd0 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66  , and not a leaf
29be0 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20  -data tree,.    
29bf0 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65    ** then update
29c00 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
29c10 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66   with an entry f
29c20 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
29c30 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  page.      ** th
29c40 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74  at the cell just
29c50 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73   inserted points
29c60 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20   to (if any)..  
29c70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
29c80 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
29c90 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b   && !leafData ){
29ca0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
29cb0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72  rmapPutOvfl(pPar
29cc0 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20  ent, nxDiv);.   
29cd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29cf0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
29d00 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
29d10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
29d20 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  if.      j++;.  
29d30 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
29d40 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
29d50 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
29d60 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
29d70 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
29d80 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
29d90 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
29da0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63  )==0 ){.    memc
29db0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
29dc0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70  ]->aData[8], &ap
29dd0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
29de0 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a  ata[8], 4);.  }.
29df0 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
29e00 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
29e10 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
29e20 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
29e30 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
29e40 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
29e50 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
29e60 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
29e70 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
29e80 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
29e90 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
29ea0 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
29eb0 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
29ec0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
29ed0 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
29ee0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
29ef0 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
29f00 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
29f10 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
29f20 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
29f30 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
29f40 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
29f50 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
29f60 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
29f70 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20  *.  ** Reparent 
29f80 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20  children of all 
29f90 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  cells..  */.  fo
29fa0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
29fb0 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  ++){.    rc = re
29fc0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
29fd0 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  (apNew[i]);.    
29fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29ff0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
2a000 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2a010 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
2a020 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29  ldPages(pParent)
2a030 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2a040 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
2a050 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20  ance_cleanup;.. 
2a060 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
2a070 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2a080 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
2a090 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
2a0a0 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
2a0b0 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2a0c0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2a0d0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
2a0e0 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
2a0f0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
2a100 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2a110 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
2a120 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
2a130 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2a140 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
2a150 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
2a160 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70  ee(apCell);.  ap
2a170 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Cell = 0;.  rc =
2a180 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74   balance(pParent
2a190 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20  , 0);.  .  /*.  
2a1a0 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
2a1b0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
2a1c0 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
2a1d0 70 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  p:.  sqlite3Page
2a1e0 46 72 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20  Free(aSpace2);. 
2a1f0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
2a200 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66  ree(apCell);.  f
2a210 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
2a220 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
2a230 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
2a240 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2a250 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
2a260 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2a270 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  New[i]);.  }.  r
2a280 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65  eleasePage(pPare
2a290 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  nt);.  TRACE(("B
2a2a0 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
2a2b0 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64   with %d: old=%d
2a2c0 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
2a2d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
2a2e0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64  Page->pgno, nOld
2a2f0 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
2a300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a310 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2a320 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
2a330 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
2a340 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20  of a btree when 
2a350 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
2a360 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
2a370 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ls.  This is an 
2a380 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d  opportunity to m
2a390 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20  ake the tree.** 
2a3a0 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65  shallower by one
2a3b0 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
2a3c0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68  c int balance_sh
2a3d0 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20  allower(MemPage 
2a3e0 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61  *pPage){.  MemPa
2a3f0 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20  ge *pChild;     
2a400 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
2a410 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f  nly child page o
2a420 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  f pPage */.  Pgn
2a430 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
2a440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2a450 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68  e number for pCh
2a460 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ild */.  int rc 
2a470 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a480 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2a490 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  code from subpro
2a4a0 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53  cedures */.  BtS
2a4b0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4d0 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73  The main BTree s
2a4e0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
2a4f0 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b  t mxCellPerPage;
2a500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2a510 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2a520 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a  cells per page *
2a530 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72   /* All cells fr
2a560 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62  om pages being b
2a570 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
2a580 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
2a590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
2a5a0 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
2a5b0 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ells */..  asser
2a5c0 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  t( pPage->pParen
2a5d0 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
2a5e0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
2a5f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2a600 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a610 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2a620 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d 20  tex) );.  pBt = 
2a630 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78  pPage->pBt;.  mx
2a640 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58  CellPerPage = MX
2a650 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70  _CELL(pBt);.  ap
2a660 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  Cell = sqlite3Ma
2a670 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72 50  lloc( mxCellPerP
2a680 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29  age*(sizeof(u8*)
2a690 2b 73 69 7a 65 6f 66 28 75 31 36 29 29 20 29 3b  +sizeof(u16)) );
2a6a0 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
2a6b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2a6c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c  _NOMEM;.  szCell
2a6d0 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
2a6e0 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b  [mxCellPerPage];
2a6f0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2a700 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  af ){.    /* The
2a710 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
2a720 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20  tely empty */.  
2a730 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2a740 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25  E: empty table %
2a750 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2a760 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o));.  }else{.  
2a770 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
2a780 67 65 20 69 73 20 65 6d 70 74 79 20 62 75 74 20  ge is empty but 
2a790 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20  has one child.  
2a7a0 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20  Transfer the.   
2a7b0 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
2a7c0 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68  from that one ch
2a7d0 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f  ild into the roo
2a7e0 74 20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20  t page if it .  
2a7f0 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20    ** will fit.  
2a800 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65  This reduces the
2a810 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
2a820 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ee by one..    *
2a830 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
2a840 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61 67  root page is pag
2a850 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73  e 1, it has less
2a860 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
2a870 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73   than.    ** its
2a880 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74   child (due to t
2a890 68 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64  he 100 byte head
2a8a0 65 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  er that occurs a
2a8b0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
2a8c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61      ** of the da
2a8d0 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20  tabase fle), so 
2a8e0 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  it might not be 
2a8f0 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  able to hold all
2a900 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
2a910 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72  information curr
2a920 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ently contained 
2a930 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49  in the child.  I
2a940 66 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20  f this is the . 
2a950 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e     ** case, then
2a960 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74   do not do the t
2a970 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20  ransfer.  Leave 
2a980 70 61 67 65 20 31 20 65 6d 70 74 79 20 65 78 63  page 1 empty exc
2a990 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ept.    ** for t
2a9a0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
2a9b0 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61   to the child pa
2a9c0 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70  ge.  The child p
2a9d0 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20  age becomes.    
2a9e0 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  ** the virtual r
2a9f0 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
2aa00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f  .    */.    pgno
2aa10 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2aa20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2aa30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2aa40 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
2aa50 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a   pgnoChild>0 );.
2aa60 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2aa70 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65  Child<=pagerPage
2aa80 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74  count(pPage->pBt
2aa90 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  ->pPager) );.   
2aaa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2aab0 65 65 47 65 74 50 61 67 65 28 70 50 61 67 65 2d  eeGetPage(pPage-
2aac0 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  >pBt, pgnoChild,
2aad0 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20   &pChild, 0);.  
2aae0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2aaf0 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2ab00 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  nce;.    if( pPa
2ab10 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  ge->pgno==1 ){. 
2ab20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ab30 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2ab40 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20  Child, pPage);. 
2ab50 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2ab60 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
2ab70 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73  alance;.      as
2ab80 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f  sert( pChild->nO
2ab90 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
2aba0 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
2abb0 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20  nFree>=100 ){.  
2abc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
2abd0 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ld information w
2abe0 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
2abf0 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20  oot page, so do 
2ac00 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
2ac10 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  opy */.        i
2ac20 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65  nt i;.        ze
2ac30 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
2ac40 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  hild->aData[0]);
2ac50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2ac60 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
2ac70 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
2ac80 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66     apCell[i] = f
2ac90 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69  indCell(pChild,i
2aca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  );.          szC
2acb0 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  ell[i] = cellSiz
2acc0 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43  ePtr(pChild, apC
2acd0 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ell[i]);.       
2ace0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d   }.        assem
2acf0 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70  blePage(pPage, p
2ad00 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70  Child->nCell, ap
2ad10 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20  Cell, szCell);. 
2ad20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
2ad30 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
2ad40 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f   of the child to
2ad50 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
2ad60 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2ad70 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2ad80 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2ad90 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  8], .           
2ada0 20 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c   get4byte(&pChil
2adb0 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d  d->aData[pChild-
2adc0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
2add0 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67  .        freePag
2ade0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2adf0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2ae00 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61  CE: child %d tra
2ae10 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c  nsfer to page 1\
2ae20 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
2ae30 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2ae40 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2ae50 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69  child has more i
2ae60 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
2ae70 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2ae80 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  root..        **
2ae90 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72   The tree is alr
2aea0 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20  eady balanced.  
2aeb0 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  Do nothing. */. 
2aec0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
2aed0 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
2aee0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
2aef0 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
2af00 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
2af10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2af20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
2af30 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64  e->aData, pChild
2af40 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  ->aData, pPage->
2af50 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
2af60 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  ;.      pPage->i
2af70 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  sInit = 0;.     
2af80 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
2af90 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2afa0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2afb0 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  Page(pPage, 0);.
2afc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2afd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2afe0 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43       freePage(pC
2aff0 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41  hild);.      TRA
2b000 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72  CE(("BALANCE: tr
2b010 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20  ansfer child %d 
2b020 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c  into root %d\n",
2b030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2b040 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61  Child->pgno, pPa
2b050 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
2b060 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  }.    rc = repar
2b070 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50  entChildPages(pP
2b080 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
2b090 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2b0a0 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  ow==0 );.#ifndef
2b0b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2b0c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2b0d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2b0e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
2b0f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2b100 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
2b110 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63  ++){ .        rc
2b120 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
2b130 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2b140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b160 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c     goto end_shal
2b170 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2b180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2b190 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2b1a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2b1b0 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61  ld);.  }.end_sha
2b1c0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20  llow_balance:.  
2b1d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43  sqlite3_free(apC
2b1e0 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ell);.  return r
2b1f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  c;.}.../*.** The
2b200 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76   root page is ov
2b210 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65  erfull.**.** Whe
2b220 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  n this happens, 
2b230 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  Create a new chi
2b240 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79  ld page and copy
2b250 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
2b260 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74   of the root int
2b270 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68  o the child.  Th
2b280 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74  en make the root
2b290 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74  .** page an empt
2b2a0 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68  y page with righ
2b2b0 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20  tChild pointing 
2b2c0 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68  to the new.** ch
2b2d0 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20  ild.   Finally, 
2b2e0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74  call balance_int
2b2f0 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e  ernal() on the n
2b300 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63  ew child.** to c
2b310 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74  ause it to split
2b320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b330 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d  balance_deeper(M
2b340 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
2b350 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2b360 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2b370 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72  value from subpr
2b380 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65  ocedures */.  Me
2b390 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
2b3a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2b3b0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2b3c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
2b3d0 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67  hild;     /* Pag
2b3e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2b3f0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2b400 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
2b410 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t;         /* Th
2b420 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e BTree */.  int
2b430 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
2b440 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65   /* Total usable
2b450 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
2b460 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2b470 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2b480 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ent of the paren
2b490 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  t page */.  u8 *
2b4a0 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  cdata;          
2b4b0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2b4c0 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  e child page */.
2b4d0 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
2b4e0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2b4f0 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69  to page header i
2b500 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e  n parent */.  in
2b510 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20  t brk;          
2b520 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2b530 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20  ontent of first 
2b540 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a  cell in parent *
2b550 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
2b560 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ge->pParent==0 )
2b570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b580 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
2b590 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
2b5a0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
2b5b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b5c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2b5d0 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  ;.  rc = allocat
2b5e0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2b5f0 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68  &pChild, &pgnoCh
2b600 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ild, pPage->pgno
2b610 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2b620 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
2b630 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2b640 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
2b650 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
2b660 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
2b670 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2b680 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
2b690 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
2b6a0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2b6b0 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62  t;.  brk = get2b
2b6c0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2b6d0 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68  );.  cdata = pCh
2b6e0 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65  ild->aData;.  me
2b6f0 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74  mcpy(cdata, &dat
2b700 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63  a[hdr], pPage->c
2b710 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
2b720 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20  e->nCell-hdr);. 
2b730 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62   memcpy(&cdata[b
2b740 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c  rk], &data[brk],
2b750 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29   usableSize-brk)
2b760 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e  ;.  if( pChild->
2b770 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20  isInit ) return 
2b780 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2b790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2b7a0 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69  reeInitPage(pChi
2b7b0 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66  ld, pPage);.  if
2b7c0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2b7d0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
2b7e0 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
2b7f0 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f  aOvfl, pPage->aO
2b800 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  vfl, pPage->nOve
2b810 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61  rflow*sizeof(pPa
2b820 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ge->aOvfl[0]));.
2b830 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
2b840 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76  low = pPage->nOv
2b850 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43  erflow;.  if( pC
2b860 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2b870 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e  ){.    pChild->n
2b880 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
2b890 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
2b8a0 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43  nCell==pPage->nC
2b8b0 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ell );.  zeroPag
2b8c0 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2b8d0 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
2b8e0 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
2b8f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2b900 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2b910 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
2b920 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
2b930 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
2b940 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50  d into %d\n", pP
2b950 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  age->pgno, pChil
2b960 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64  d->pgno));.#ifnd
2b970 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2b980 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
2b990 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2b9a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b9b0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2b9c0 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67  (pBt, pChild->pg
2b9d0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
2b9e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
2b9f0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2ba00 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
2ba10 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  out;.    for(i=0
2ba20 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
2ba30 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  l; i++){.      r
2ba40 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2ba50 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20  l(pChild, i);.  
2ba60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ba70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ba80 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
2ba90 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  per_out;.      }
2baa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2bab0 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  f.  rc = balance
2bac0 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29  _nonroot(pChild)
2bad0 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72  ;..balancedeeper
2bae0 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
2baf0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72  age(pChild);.  r
2bb00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2bb10 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65  ** Decide if the
2bb20 20 70 61 67 65 20 70 50 61 67 65 20 6e 65 65 64   page pPage need
2bb30 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
2bb40 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20  .  If balancing 
2bb50 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  is.** required, 
2bb60 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72  call the appropr
2bb70 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72  iate balancing r
2bb80 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
2bb90 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65  c int balance(Me
2bba0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
2bbb0 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74  t insert){.  int
2bbc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bbd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2bbe0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2bbf0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2bc00 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
2bc10 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20  >pParent==0 ){. 
2bc20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2bc30 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2bc40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2bc50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bc60 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
2bc70 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20  flow>0 ){.      
2bc80 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65  rc = balance_dee
2bc90 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  per(pPage);.    
2bca0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2bcb0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
2bcc0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->nCell==0 ){.  
2bcd0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2bce0 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65  _shallower(pPage
2bcf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2bd00 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
2bd10 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  >nOverflow>0 || 
2bd20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73 65 72  .        (!inser
2bd30 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  t && pPage->nFre
2bd40 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  e>pPage->pBt->us
2bd50 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b  ableSize*2/3) ){
2bd60 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2bd70 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67  nce_nonroot(pPag
2bd80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
2bd90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bda0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2bdb0 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73   checks all curs
2bdc0 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ors that point t
2bdd0 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74  o table pgnoRoot
2bde0 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  ..** If any of t
2bdf0 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72  hose cursors wer
2be00 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
2be10 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66  Flag==0 in a dif
2be20 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61  ferent.** databa
2be30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61  se connection (a
2be40 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2be50 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73  tion that shares
2be60 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61   the pager.** ca
2be70 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72  che with the cur
2be80 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  rent connection)
2be90 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20   and that other 
2bea0 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69  connection .** i
2beb0 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61  s not in the Rea
2bec0 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74  dUncommmitted st
2bed0 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ate, then this r
2bee0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a  outine returns .
2bef0 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ** SQLITE_LOCKED
2bf00 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20  ..**.** As well 
2bf10 61 73 20 63 75 72 73 6f 72 73 20 77 69 74 68 20  as cursors with 
2bf20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f  wrFlag==0, curso
2bf30 72 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  rs with wrFlag==
2bf40 31 20 61 6e 64 20 0a 2a 2a 20 69 73 49 6e 63 72  1 and .** isIncr
2bf50 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72  blobHandle==1 ar
2bf60 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65  e also considere
2bf70 64 20 27 72 65 61 64 27 20 63 75 72 73 6f 72 73  d 'read' cursors
2bf80 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 0a 2a  . Incremental .*
2bf90 2a 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 61  * blob cursors a
2bfa0 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  re used for both
2bfb0 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69   reading and wri
2bfc0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ting..**.** When
2bfd0 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
2bfe0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 6e   root page of an
2bff0 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74   intkey table, t
2c000 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c010 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  also.** responsi
2c020 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69 64 61  ble for invalida
2c030 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c  ting incremental
2c040 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 77 68   blob cursors wh
2c050 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 77  en the table row
2c060 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65  .** on which the
2c070 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69 73 20  y are opened is 
2c080 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69 66  deleted or modif
2c090 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61 72 65  ied. Cursors are
2c0a0 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
2c0b0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2c0c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73   following rules
2c0d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65  :.**.**   1) Whe
2c0e0 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  n BtreeClearTabl
2c0f0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  e() is called to
2c100 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65   completely dele
2c110 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  te the contents.
2c120 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42 2d 54  **      of a B-T
2c130 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78 63 6c  ree table, pExcl
2c140 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ude is set to ze
2c150 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72  ro and parameter
2c160 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20   iRow is .**    
2c170 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72    set to non-zer
2c180 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  o. In this case 
2c190 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  all incremental 
2c1a0 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
2c1b0 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  n.**      on the
2c1c0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
2c1d0 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e   pgnoRoot are in
2c1e0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  validated..**.**
2c1f0 20 20 20 32 29 20 57 68 65 6e 20 42 74 72 65 65     2) When Btree
2c200 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65 65 44  Insert(), BtreeD
2c210 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
2c220 50 75 74 44 61 74 61 28 29 20 69 73 20 63 61 6c  PutData() is cal
2c230 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  led to .**      
2c240 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65 20 72  modify a table r
2c250 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20 73 74  ow via an SQL st
2c260 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64  atement, pExclud
2c270 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
2c280 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65 20 63  .**      write c
2c290 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 64 6f  ursor used to do
2c2a0 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f   the modificatio
2c2b0 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20  n and parameter 
2c2c0 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a 20 20  iRow is set.**  
2c2d0 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 67      to the integ
2c2e0 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74 68 65  er row id of the
2c2f0 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20 62 65   B-Tree entry be
2c300 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e  ing modified. Un
2c310 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70 45 78  less.**      pEx
2c320 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c 66 20  clude is itself 
2c330 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
2c340 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  lob cursor, then
2c350 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c   all incremental
2c360 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20 63 75  .**      blob cu
2c370 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f  rsors open on ro
2c380 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20 42 2d  w iRow of the B-
2c390 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c 69 64  Tree are invalid
2c3a0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29  ated..**.**   3)
2c3b0 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c 75 64   If both pExclud
2c3c0 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65 20 73  e and iRow are s
2c3d0 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69  et to zero, no i
2c3e0 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2c3f0 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f 72 73  .**      cursors
2c400 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2c410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c420 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 0a  checkReadLocks(.
2c430 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
2c440 20 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f   .  Pgno pgnoRoo
2c450 74 2c 20 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t, .  BtCursor *
2c460 70 45 78 63 6c 75 64 65 2c 0a 20 20 69 36 34 20  pExclude,.  i64 
2c470 69 52 6f 77 0a 29 7b 0a 20 20 42 74 43 75 72 73  iRow.){.  BtCurs
2c480 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65  or *p;.  BtShare
2c490 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d  d *pBt = pBtree-
2c4a0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
2c4b0 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  *db = pBtree->db
2c4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2c4d0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2c4e0 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
2c4f0 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
2c500 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
2c510 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70  t){.    if( p==p
2c520 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e  Exclude ) contin
2c530 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ue;.    if( p->p
2c540 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f  gnoRoot!=pgnoRoo
2c550 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  t ) continue;.#i
2c560 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c570 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69  T_INCRBLOB.    i
2c580 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
2c590 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20 20 20  Handle && ( .   
2c5a0 20 20 20 20 20 20 28 21 70 45 78 63 6c 75 64 65        (!pExclude
2c5b0 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20 20 20   && iRow).      
2c5c0 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26 26 20  || (pExclude && 
2c5d0 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63  !pExclude->isInc
2c5e0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 70  rblobHandle && p
2c5f0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
2c600 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  w).    )){.     
2c610 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
2c620 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2c630 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
2c640 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  ( p->eState!=CUR
2c650 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74  SOR_VALID ) cont
2c660 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
2c670 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e  >wrFlag==0 .#ifn
2c680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c690 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c  INCRBLOB.     ||
2c6a0 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61   p->isIncrblobHa
2c6b0 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  ndle.#endif.    
2c6c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c6d0 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
2c6e0 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
2c6f0 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30 20   if( dbOther==0 
2c700 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62 4f  ||.         (dbO
2c710 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f  ther!=db && (dbO
2c720 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51  ther->flags & SQ
2c730 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2c740 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20  tted)==0) ){.   
2c750 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c760 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
2c770 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
2c780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2c7a0 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
2c7b0 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54  to the BTree.  T
2c7c0 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20  he key is given 
2c7d0 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a  by (pKey,nKey).*
2c7e0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69  * and the data i
2c7f0 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74  s given by (pDat
2c800 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63  a,nData).  The c
2c810 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
2c820 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20  ly to.** define 
2c830 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72  what table the r
2c840 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
2c850 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20  inserted into.  
2c860 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
2c870 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2c880 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74  t a random locat
2c890 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ion..**.** For a
2c8a0 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20  n INTKEY table, 
2c8b0 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61  only the nKey va
2c8c0 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69  lue of the key i
2c8d0 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
2c8e0 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
2c8f0 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62  r a ZERODATA tab
2c900 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e  le, the pData an
2c910 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68  d nData are both
2c920 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
2c930 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
2c940 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ert(.  BtCursor 
2c950 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
2c960 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
2c970 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61  data into the ta
2c980 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73  ble of this curs
2c990 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  or */.  const vo
2c9a0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
2c9b0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
2c9c0 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  y of the new rec
2c9d0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
2c9e0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
2c9f0 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64  nData,  /* The d
2ca00 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72  ata of the new r
2ca10 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
2ca20 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
2ca30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ca40 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62  ber of extra 0 b
2ca50 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
2ca60 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  o data */.  int 
2ca70 61 70 70 65 6e 64 42 69 61 73 20 20 20 20 20 20  appendBias      
2ca80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ca90 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69  ue if this is li
2caa0 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a  kely an append *
2cab0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2cac0 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20   int loc;.  int 
2cad0 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65  szNew;.  MemPage
2cae0 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65   *pPage;.  Btree
2caf0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
2cb00 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
2cb10 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2cb20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
2cb30 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e  ldCell;.  unsign
2cb40 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c  ed char *newCell
2cb50 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2cb60 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2cb70 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
2cb80 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2cb90 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
2cba0 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
2cbb0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
2cbc0 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
2cbd0 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   an insert */.  
2cbe0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2cbf0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2cc00 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2cc10 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2cc20 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2cc30 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2cc40 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75  ly );.  if( !pCu
2cc50 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
2cc60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2cc70 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72  ERM;   /* Cursor
2cc80 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72   not open for wr
2cc90 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  iting */.  }.  i
2cca0 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
2ccb0 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCur->pBtree, 
2ccc0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2ccd0 70 43 75 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20  pCur, nKey) ){. 
2cce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ccf0 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2cd00 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2cd10 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2cd20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  lock */.  }.  if
2cd30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2cd40 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2cd50 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2cd60 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >skip;.  }..  /*
2cd70 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2cd80 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
2cd90 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2cda0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2cdb0 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
2cdc0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
2cdd0 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
2cde0 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
2cdf0 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2ce00 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2ce10 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
2ce20 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
2ce30 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2ce40 75 72 2c 20 70 4b 65 79 2c 20 30 2c 20 6e 4b 65  ur, pKey, 0, nKe
2ce50 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26  y, appendBias, &
2ce60 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  loc)).  ){.    r
2ce70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2ce80 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
2ce90 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2cea0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
2ceb0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
2cec0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2ced0 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74  f || !pPage->int
2cee0 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28  Key );.  TRACE((
2cef0 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25  "INSERT: table=%
2cf00 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74  d nkey=%lld ndat
2cf10 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c  a=%d page=%d %s\
2cf20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  n",.          pC
2cf30 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b  ur->pgnoRoot, nK
2cf40 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65  ey, nData, pPage
2cf50 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
2cf60 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72    loc==0 ? "over
2cf70 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e  write" : "new en
2cf80 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74  try"));.  assert
2cf90 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2cfa0 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  );.  allocateTem
2cfb0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e  pSpace(pBt);.  n
2cfc0 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  ewCell = pBt->pT
2cfd0 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e  mpSpace;.  if( n
2cfe0 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
2cff0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d000 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
2d010 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
2d020 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
2d030 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65  Data, nData, nZe
2d040 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69  ro, &szNew);.  i
2d050 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2d060 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72  _insert;.  asser
2d070 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69  t( szNew==cellSi
2d080 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77  zePtr(pPage, new
2d090 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
2d0a0 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c  t( szNew<=MX_CEL
2d0b0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
2d0c0 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43   if( loc==0 && C
2d0d0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2d0e0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2d0f0 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20   u16 szOld;.    
2d100 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
2d110 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
2d120 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2d130 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2d140 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2d150 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2d160 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d170 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
2d180 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64  t;.    }.    old
2d190 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2d1a0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2d1b0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
2d1c0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2d1d0 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
2d1e0 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
2d1f0 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
2d200 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2d210 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
2d220 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2d230 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
2d240 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2d250 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2d260 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2d270 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a  e, pCur->idx, sz
2d280 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Old);.  }else if
2d290 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65  ( loc<0 && pPage
2d2a0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
2d2b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d2c0 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72  leaf );.    pCur
2d2d0 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75  ->idx++;.    pCu
2d2e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2d2f0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
2d300 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65  idNKey = 0;.  }e
2d310 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2d320 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2d330 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72    }.  rc = inser
2d340 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2d350 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  r->idx, newCell,
2d360 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
2d370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d380 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  OK ) goto end_in
2d390 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c  sert;.  rc = bal
2d3a0 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b 0a  ance(pPage, 1);.
2d3b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d3c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2d3d0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2d3e0 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72  .end_insert:.  r
2d3f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2d400 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e  ** Delete the en
2d410 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72  try that the cur
2d420 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
2d430 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
2d440 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
2d450 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
2d460 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
2d470 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
2d480 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
2d490 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2d4a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2d4b0 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  age;.  unsigned 
2d4c0 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
2d4d0 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67  nt rc;.  Pgno pg
2d4e0 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42  noChild = 0;.  B
2d4f0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
2d500 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
2d510 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2d520 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2d530 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2d540 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2d550 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2d560 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
2d570 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
2d580 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
2d590 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
2d5a0 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72  ransaction befor
2d5b0 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65  e doing a delete
2d5c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74   */.    rc = pBt
2d5d0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2d5e0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2d5f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2d600 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2d610 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2d620 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2d630 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2d640 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2d650 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2d660 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28  >skip;.  }.  if(
2d670 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50   pCur->idx >= pP
2d680 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2d690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d6a0 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63  ERROR;  /* The c
2d6b0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
2d6c0 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e  nting to anythin
2d6d0 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21  g */.  }.  if( !
2d6e0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a  pCur->wrFlag ){.
2d6f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d700 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64  E_PERM;   /* Did
2d710 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73 20 63   not open this c
2d720 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74 69 6e  ursor for writin
2d730 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63  g */.  }.  if( c
2d740 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43  heckReadLocks(pC
2d750 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72  ur->pBtree, pCur
2d760 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2d770 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  , pCur->info.nKe
2d780 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
2d790 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
2d7a0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
2d7b0 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
2d7c0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
2d7d0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
2d7e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
2d7f0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20  sor position (a 
2d800 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72  no-op if the cur
2d810 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20  sor is not in . 
2d820 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49   ** CURSOR_REQUI
2d830 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e  RESEEK state) an
2d840 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69 74  d save the posit
2d850 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
2d860 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20  r cursors .  ** 
2d870 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2d880 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c   table. Then cal
2d890 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
2d8a0 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67  ite() on the pag
2d8b0 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
2d8c0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65  entry will be de
2d8d0 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f  leted from..  */
2d8e0 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20  .  if( .    (rc 
2d8f0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2d900 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29 21 3d  osition(pCur))!=
2d910 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2d920 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2d930 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2d940 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  t, pCur))!=0 ||.
2d950 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
2d960 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2d970 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a  e->pDbPage))!=0.
2d980 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2d990 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  rc;.  }..  /* Lo
2d9a0 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69  cate the cell wi
2d9b0 74 68 69 6e 20 69 74 73 20 70 61 67 65 20 61 6e  thin its page an
2d9c0 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f  d leave pCell po
2d9d0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20  inting to the.  
2d9e0 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65  ** data. The cle
2d9f0 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72  arCell() call fr
2da00 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ees any overflow
2da10 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
2da20 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
2da30 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69  cell. The cell i
2da40 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69  tself is still i
2da50 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43  ntact..  */.  pC
2da60 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2da70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2da80 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2da90 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2daa0 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2dab0 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  (pCell);.  }.  r
2dac0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2dad0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69  age, pCell);.  i
2dae0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2daf0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
2db00 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2db10 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2db20 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72   The entry we ar
2db30 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
2db40 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
2db50 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a  so if we do not.
2db60 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68      ** do someth
2db70 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  ing we will leav
2db80 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69  e a hole on an i
2db90 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20  nternal page..  
2dba0 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
2dbb0 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79  fill the hole by
2dbc0 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c   moving in a cel
2dbd0 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20  l from a leaf.  
2dbe0 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  The.    ** next 
2dbf0 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f  Cell after the o
2dc00 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ne to be deleted
2dc10 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2dc20 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20  o exist and.    
2dc30 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20  ** to be a leaf 
2dc40 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  so we can use it
2dc50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43  ..    */.    BtC
2dc60 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20  ursor leafCur;. 
2dc70 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2dc80 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
2dc90 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
2dca0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
2dcb0 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
2dcc0 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69  ssert( !pPage->i
2dcd0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  ntKey );.    sql
2dce0 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70  ite3BtreeGetTemp
2dcf0 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65  Cursor(pCur, &le
2dd00 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d  afCur);.    rc =
2dd10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2dd20 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74  t(&leafCur, &not
2dd30 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
2dd40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2dd50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2dd60 65 33 50 61 67 65 72 57 72 69 74 65 28 6c 65 61  e3PagerWrite(lea
2dd70 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50  fCur.pPage->pDbP
2dd80 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2dd90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dda0 4b 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73  K ){.      u16 s
2ddb0 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41  zNext;.      TRA
2ddc0 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
2ddd0 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74  le=%d delete int
2dde0 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65  ernal from %d re
2ddf0 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20  place from leaf 
2de00 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2de10 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2de20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61  pPage->pgno, lea
2de30 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f  fCur.pPage->pgno
2de40 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65  ));.      dropCe
2de50 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2de60 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72  idx, cellSizePtr
2de70 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b  (pPage, pCell));
2de80 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66  .      pNext = f
2de90 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e  indCell(leafCur.
2dea0 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69  pPage, leafCur.i
2deb0 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78  dx);.      szNex
2dec0 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  t = cellSizePtr(
2ded0 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70  leafCur.pPage, p
2dee0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Next);.      ass
2def0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  ert( MX_CELL_SIZ
2df00 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34  E(pBt)>=szNext+4
2df10 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61   );.      alloca
2df20 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
2df30 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c  ;.      tempCell
2df40 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
2df50 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d  e;.      if( tem
2df60 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
2df70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2df80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
2df90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2dfa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dfb0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
2dfc0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2dfd0 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e  dx, pNext-4, szN
2dfe0 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c  ext+4, tempCell,
2dff0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2e000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e020 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
2e030 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
2e040 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e   pCur->idx), pgn
2e050 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  oChild);.       
2e060 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2e070 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  age, 0);.      }
2e080 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2e090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e0a0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61      dropCell(lea
2e0b0 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
2e0c0 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29  Cur.idx, szNext)
2e0d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
2e0e0 61 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70  alance(leafCur.p
2e0f0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Page, 0);.      
2e100 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
2e110 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
2e120 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43  empCursor(&leafC
2e130 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
2e140 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
2e150 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
2e160 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
2e170 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ",.       pCur->
2e180 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2e190 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f  >pgno));.    dro
2e1a0 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2e1b0 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65  r->idx, cellSize
2e1c0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2e1d0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c  ));.    rc = bal
2e1e0 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  ance(pPage, 0);.
2e1f0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2e200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
2e210 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2e220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2e240 65 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61  e a new BTree ta
2e250 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ble.  Write into
2e260 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61   *piTable the pa
2e270 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
2e280 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2e290 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  f the new table.
2e2a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20  .**.** The type 
2e2b0 6f 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72  of type is deter
2e2c0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61  mined by the fla
2e2d0 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f  gs parameter.  O
2e2e0 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  nly the.** follo
2e2f0 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66  wing values of f
2e300 6c 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74  lags are current
2e310 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65  ly in use.  Othe
2e320 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20  r values for.** 
2e330 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20  flags might not 
2e340 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  work:.**.**     
2e350 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52  BTREE_INTKEY|BTR
2e360 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20  EE_LEAFDATA     
2e370 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62  Used for SQL tab
2e380 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b  les with rowid k
2e390 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  eys.**     BTREE
2e3a0 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20  _ZERODATA       
2e3b0 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20             Used 
2e3c0 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a  for SQL indices.
2e3d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
2e3e0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
2e3f0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
2e400 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
2e410 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2e420 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
2e430 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
2e440 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a   Pgno pgnoRoot;.
2e450 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
2e460 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
2e470 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
2e480 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
2e490 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
2e4a0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
2e4b0 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
2e4c0 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74  ransaction first
2e4d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74   */.    rc = pBt
2e4e0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2e4f0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2e500 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2e510 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e520 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2e530 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66  readOnly );..#if
2e540 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e550 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20  AUTOVACUUM.  rc 
2e560 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2e570 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c  age(pBt, &pRoot,
2e580 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30   &pgnoRoot, 1, 0
2e590 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2e5a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e5b0 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  }.#else.  if( pB
2e5c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2e5d0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
2e5e0 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
2e5f0 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
2e600 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2e610 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
2e620 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2e630 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
2e640 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
2e650 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69  /..    /* Creati
2e660 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d  ng a new table m
2e670 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75  ay probably requ
2e680 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78  ire moving an ex
2e690 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a  isting database.
2e6a0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72      ** to make r
2e6b0 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20  oom for the new 
2e6c0 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65  tables root page
2e6d0 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70  . In case this p
2e6e0 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a  age turns.    **
2e6f0 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76   out to be an ov
2e700 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c  erflow page, del
2e710 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  ete all overflow
2e720 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73   page-map caches
2e730 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20  .    ** held by 
2e740 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20  open cursors..  
2e750 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64    */.    invalid
2e760 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
2e770 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f  che(pBt);..    /
2e780 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  * Read the value
2e790 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d   of meta[3] from
2e7a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2e7b0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65   determine where
2e7c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
2e7d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
2e7e0 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f   table should go
2e7f0 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65  . meta[3] is the
2e800 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
2e810 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  ge.    ** create
2e820 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65  d so far, so the
2e830 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69   new root-page i
2e840 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20  s (meta[3]+1).. 
2e850 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2e860 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2e870 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f  ta(p, 4, &pgnoRo
2e880 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ot);.    if( rc!
2e890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e8a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e8b0 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f     }.    pgnoRoo
2e8c0 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  t++;..    /* The
2e8d0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d   new root-page m
2e8e0 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61  ay not be alloca
2e8f0 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72  ted on a pointer
2e900 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68  -map page, or th
2e910 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47  e.    ** PENDING
2e920 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20  _BYTE page..    
2e930 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67  */.    while( pg
2e940 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50  noRoot==PTRMAP_P
2e950 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52  AGENO(pBt, pgnoR
2e960 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  oot) ||.        
2e970 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e  pgnoRoot==PENDIN
2e980 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2e990 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f   ){.      pgnoRo
2e9a0 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ot++;.    }.    
2e9b0 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74  assert( pgnoRoot
2e9c0 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  >=3 );..    /* A
2e9d0 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20  llocate a page. 
2e9e0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75  The page that cu
2e9f0 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20  rrently resides 
2ea00 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c  at pgnoRoot will
2ea10 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64  .    ** be moved
2ea20 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2ea30 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74  d page (unless t
2ea40 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2ea50 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a  e happens.    **
2ea60 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67   to reside at pg
2ea70 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a  noRoot)..    */.
2ea80 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2ea90 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2eaa0 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e  &pPageMove, &pgn
2eab0 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c  oMove, pgnoRoot,
2eac0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   1);.    if( rc!
2ead0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2eae0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2eaf0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67     }..    if( pg
2eb00 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74  noMove!=pgnoRoot
2eb10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e   ){.      /* pgn
2eb20 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67  oRoot is the pag
2eb30 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  e that will be u
2eb40 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  sed for the root
2eb50 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a  -page of.      *
2eb60 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
2eb70 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72  (assuming an err
2eb80 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72  or did not occur
2eb90 29 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20  ). But we were. 
2eba0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2ebb0 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72  d pgnoMove. If r
2ebc0 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66  equired (i.e. if
2ebd0 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f   it was not allo
2ebe0 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  cated.      ** b
2ebf0 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20  y extending the 
2ec00 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65  file), the curre
2ec10 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74  nt page at posit
2ec20 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20  ion pgnoMove.   
2ec30 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
2ec40 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20   journaled..    
2ec50 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54    */.      u8 eT
2ec60 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ype;.      Pgno 
2ec70 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20  iPtrPage;..     
2ec80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2ec90 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20  geMove);..      
2eca0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  /* Move the page
2ecb0 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67   currently at pg
2ecc0 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f  noRoot to pgnoMo
2ecd0 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ve. */.      rc 
2ece0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2ecf0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2ed00 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
2ed10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2ed20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ed30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ed40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2ed50 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2ed60 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70   pgnoRoot, &eTyp
2ed70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
2ed80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ed90 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d  ITE_OK || eType=
2eda0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
2edb0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2edc0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
2edd0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ede0 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2edf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ee00 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2ee10 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
2ee20 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20  _ROOTPAGE );.   
2ee30 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2ee40 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  !=PTRMAP_FREEPAG
2ee50 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
2ee60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ee70 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2ee80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2ee90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2eea0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2eeb0 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2eec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2eed0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2eee0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2eef0 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20  , pRoot, eType, 
2ef00 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f  iPtrPage, pgnoMo
2ef10 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  ve, 0);.      re
2ef20 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2ef30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  ;..      /* Obta
2ef40 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20 70  in the page at p
2ef50 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20  gnoRoot */.     
2ef60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ef70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2ef80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2ef90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2efa0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2efb0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
2efc0 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
2efd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2efe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2eff0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2f000 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f010 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2f020 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2f030 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f050 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2f060 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2f070 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2f080 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f090 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d    pRoot = pPageM
2f0a0 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20  ove;.    } ..   
2f0b0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
2f0c0 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d  ointer-map and m
2f0d0 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74 68  eta-data with th
2f0e0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
2f0f0 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72  number. */.    r
2f100 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2f110 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52  t, pgnoRoot, PTR
2f120 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29  MAP_ROOTPAGE, 0)
2f130 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2f140 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f150 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2f160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2f170 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f180 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2f190 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29  (p, 4, pgnoRoot)
2f1a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2f1b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f1c0 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2f1d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2f1e0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ..  }else{.    r
2f1f0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2f200 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
2f210 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
2f220 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
2f230 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
2f240 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
2f250 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2f260 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d  writeable(pRoot-
2f270 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 7a  >pDbPage) );.  z
2f280 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66  eroPage(pRoot, f
2f290 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29  lags | PTF_LEAF)
2f2a0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
2f2b0 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62  Unref(pRoot->pDb
2f2c0 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c  Page);.  *piTabl
2f2d0 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f  e = (int)pgnoRoo
2f2e0 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
2f2f0 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
2f300 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
2f310 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2f320 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74  nt *piTable, int
2f330 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
2f340 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
2f350 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
2f360 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
2f370 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65  .  rc = btreeCre
2f380 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61  ateTable(p, piTa
2f390 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73  ble, flags);.  s
2f3a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2f3b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2f3c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2f3d0 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
2f3e0 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  ase page and all
2f3f0 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20   its children.  
2f400 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61  Return.** the pa
2f410 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
2f420 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
2f430 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  t clearDatabaseP
2f440 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
2f450 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
2f460 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
2f470 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
2f480 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
2f490 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
2f4a0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
2f4b0 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d  o clear */.  Mem
2f4c0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
2f4d0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
2f4e0 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65  e.  NULL for the
2f4f0 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66   root */.  int f
2f500 72 65 65 50 61 67 65 46 6c 61 67 20 20 20 20 20  reePageFlag     
2f510 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70   /* Deallocate p
2f520 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  age if true */.)
2f530 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2f540 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
2f550 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2f560 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
2f570 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  i;..  assert( sq
2f580 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2f590 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2f5a0 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72    if( pgno>pager
2f5b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
2f5c0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
2f5d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2f5e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
2f5f0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2f600 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
2f610 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  &pPage, pParent)
2f620 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2f630 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2f640 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69  age_out;.  for(i
2f650 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
2f660 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  ll; i++){.    pC
2f670 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2f680 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
2f690 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2f6a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65  {.      rc = cle
2f6b0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2f6c0 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
2f6d0 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  ll), pPage->pPar
2f6e0 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ent, 1);.      i
2f6f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2f700 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2f710 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
2f720 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
2f730 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
2f740 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2f750 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2f760 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  out;.  }.  if( !
2f770 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f780 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
2f790 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
2f7a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2f7b0 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65  aData[8]), pPage
2f7c0 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20  ->pParent, 1);. 
2f7d0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2f7e0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2f7f0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2f800 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29  ( freePageFlag )
2f810 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2f820 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65  age(pPage);.  }e
2f830 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71  lse if( (rc = sq
2f840 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f850 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2f860 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50  ==0 ){.    zeroP
2f870 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
2f880 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46  ->aData[0] | PTF
2f890 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65  _LEAF);.  }..cle
2f8a0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2f8b0 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
2f8c0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
2f8d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f8e0 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72  Delete all infor
2f8f0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69  mation from a si
2f900 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
2f910 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61  e database.  iTa
2f920 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61  ble is.** the pa
2f930 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2f940 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2f950 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  le.  After this 
2f960 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c  routine returns,
2f970 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
2f980 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20  e is empty, but 
2f990 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a  still exists..**
2f9a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f9b0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2f9c0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2f9d0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2f9e0 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73  pen.** read curs
2f9f0 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2fa00 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75  .  Open write cu
2fa10 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20  rsors are moved 
2fa20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f  to the.** root o
2fa30 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  f the table..*/.
2fa40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2fa50 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65  ClearTable(Btree
2fa60 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2fa70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
2fa80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2fa90 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
2faa0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
2fab0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
2fac0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2fad0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2fae0 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
2faf0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2fb00 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2fb10 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
2fb20 73 65 20 69 66 28 20 28 72 63 20 3d 20 63 68 65  se if( (rc = che
2fb30 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
2fb40 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53  Table, 0, 1))!=S
2fb50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fb60 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
2fb70 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
2fb80 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2fb90 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2fba0 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
2fbb0 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
2fbc0 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
2fbd0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
2fbe0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2fbf0 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
2fc00 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e, 0, 0);.  }.  
2fc10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2fc20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
2fc30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  c;.}../*.** Eras
2fc40 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
2fc50 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64  n in a table and
2fc60 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66   add the root of
2fc70 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a   the table to.**
2fc80 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2fc90 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74  Except, the root
2fca0 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c   of the principl
2fcb0 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65  e table (the one
2fcc0 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69   on.** page 1) i
2fcd0 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f  s never added to
2fce0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2fcf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2fd00 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2fd10 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2fd20 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2fd30 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20  open.** cursors 
2fd40 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  on the table..**
2fd50 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55  .** If AUTOVACUU
2fd60 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64  M is enabled and
2fd70 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61   the page at iTa
2fd80 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  ble is not the l
2fd90 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  ast.** root page
2fda0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fdb0 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
2fdc0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a  last root page .
2fdd0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
2fde0 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64  se file is moved
2fdf0 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66   into the slot f
2fe00 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
2fe10 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e   by.** iTable an
2fe20 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74  d that last slot
2fe30 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
2fe40 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72  ed by the last r
2fe50 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  oot page.** is a
2fe60 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
2fe70 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20  list instead of 
2fe80 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73  iTable.  In this
2fe90 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f   say, all.** roo
2fea0 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74  t pages are kept
2feb0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2fec0 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
2fed0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a  e file, which.**
2fee0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
2fef0 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20  r AUTOVACUUM to 
2ff00 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69  work right.  *pi
2ff10 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
2ff20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d  the .** page num
2ff30 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f  ber that used to
2ff40 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   be the last roo
2ff50 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
2ff60 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  le before.** the
2ff70 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61   move.  If no pa
2ff80 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a  ge gets moved, *
2ff90 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
2ffa0 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  o 0..** The last
2ffb0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65   root page is re
2ffc0 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33  corded in meta[3
2ffd0 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ] and the value 
2ffe0 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73  of.** meta[3] is
2fff0 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73   updated by this
30000 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73   procedure..*/.s
30010 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44  tatic int btreeD
30020 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
30030 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
30040 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
30050 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
30060 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
30070 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
30080 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
30090 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
300a0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
300b0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
300c0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
300d0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
300e0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
300f0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
30100 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
30110 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65  .  /* It is ille
30120 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61  gal to drop a ta
30130 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  ble if any curso
30140 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  rs are open on t
30150 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
30160 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
30170 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  e in auto-vacuum
30180 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e   mode the backen
30190 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20  d may.  ** need 
301a0 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20  to move another 
301b0 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c  root-page to fil
301c0 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20  l a gap left by 
301d0 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a  the deleted.  **
301e0 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61   root page. If a
301f0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61  n open cursor wa
30200 73 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67  s using this pag
30210 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c  e a problem woul
30220 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20  d .  ** occur.. 
30230 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
30240 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65  Cursor ){.    re
30250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
30260 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ED;.  }..  rc = 
30270 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
30280 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
30290 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30  Table, &pPage, 0
302a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
302b0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
302c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
302d0 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  rTable(p, iTable
302e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
302f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30300 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
30310 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69  n rc;.  }..  *pi
30320 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Moved = 0;..  if
30330 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69  ( iTable>1 ){.#i
30340 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
30350 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30360 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
30370 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  age);.    releas
30380 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65  ePage(pPage);.#e
30390 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d  lse.    if( pBt-
303a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
303b0 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f       Pgno maxRoo
303c0 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  tPgno;.      rc 
303d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
303e0 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78  tMeta(p, 4, &max
303f0 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20  RootPgno);.     
30400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
30420 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
30430 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
30440 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
30450 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d      if( iTable==
30460 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20  maxRootPgno ){. 
30470 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
30480 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
30490 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c  pped is the tabl
304a0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
304b0 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
304c0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
304d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
304e0 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  put the root pag
304f0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  e on the free li
30500 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  st. .        */.
30510 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
30520 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30530 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30540 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
30550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30570 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30580 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
30590 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
305a0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
305b0 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68  opped does not h
305c0 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20  ave the largest 
305d0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
305e0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
305f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20  he database. So 
30600 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68  move the page th
30610 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65  at does into the
30620 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70   .        ** gap
30630 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
30640 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a  eted root-page..
30650 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30660 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76     MemPage *pMov
30670 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  e;.        relea
30680 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
30690 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
306a0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
306b0 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
306c0 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
306d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
306e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
306f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30710 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
30720 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20  age(pBt, pMove, 
30730 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
30740 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a   0, iTable, 0);.
30750 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30760 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
30770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30790 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
307a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
307b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
307c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
307d0 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
307e0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
307f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
30810 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
30820 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
30830 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  freePage(pMove);
30840 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
30850 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
30860 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
308a0 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52   *piMoved = maxR
308b0 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ootPgno;.      }
308c0 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
308d0 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74  he new 'max-root
308e0 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20  -page' value in 
308f0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
30900 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20  der. This.      
30910 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61  ** is the old va
30920 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65  lue less one, le
30930 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74  ss one more if t
30940 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20  hat happens to. 
30950 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f       ** be a roo
30960 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c  t-page number, l
30970 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66  ess one again if
30980 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20   that is the.   
30990 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
309a0 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a  TE_PAGE..      *
309b0 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50  /.      maxRootP
309c0 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  gno--;.      if(
309d0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45   maxRootPgno==PE
309e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
309f0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
30a00 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
30a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30a20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54   maxRootPgno==PT
30a30 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
30a40 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b   maxRootPgno) ){
30a50 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
30a60 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
30a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
30a80 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49  xRootPgno!=PENDI
30a90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
30aa0 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) );..      rc =
30ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
30ac0 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61  ateMeta(p, 4, ma
30ad0 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
30ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
30af0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
30b00 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
30b10 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
30b20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
30b30 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c  e{.    /* If sql
30b40 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
30b50 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e  le was called on
30b60 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20   page 1. */.    
30b70 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
30b80 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
30b90 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  EAF );.    relea
30ba0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
30bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
30bc0 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   .}.int sqlite3B
30bd0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74  treeDropTable(Bt
30be0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
30bf0 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64  le, int *piMoved
30c00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
30c10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
30c20 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
30c30 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
30c40 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65  = btreeDropTable
30c50 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f  (p, iTable, piMo
30c60 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ved);.  sqlite3B
30c70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
30c80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
30c90 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65  *.** Read the me
30ca0 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ta-information o
30cb0 75 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ut of a database
30cc0 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a   file.  Meta[0].
30cd0 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
30ce0 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63   of free pages c
30cf0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
30d00 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
30d10 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65  1].** through me
30d20 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c  ta[15] are avail
30d30 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20  able for use by 
30d40 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20  higher layers.  
30d50 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65  Meta[0].** is re
30d60 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68  ad-only, the oth
30d70 65 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  ers are read/wri
30d80 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73  te..** .** The s
30d90 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62  chema layer numb
30da0 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20  ers meta values 
30db0 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74  differently.  At
30dc0 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c   the schema.** l
30dd0 61 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65  ayer (and the Se
30de0 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64  tCookie and Read
30df0 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20  Cookie opcodes) 
30e00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
30e10 20 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e   free pages is n
30e20 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20  ot visible.  So 
30e30 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65  Cookie[0] is the
30e40 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d   same as Meta[1]
30e50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30e60 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72  BtreeGetMeta(Btr
30e70 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
30e80 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44  u32 *pMeta){.  D
30e90 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
30ea0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
30eb0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
30ec0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
30ed0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
30ee0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
30ef0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
30f00 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ->db;..  /* Read
30f10 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20  ing a meta-data 
30f20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61  value requires a
30f30 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
30f40 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a  ge 1 (and hence.
30f50 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f    ** the sqlite_
30f60 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65  master table. We
30f70 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20   grab this lock 
30f80 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
30f90 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f  ether or.  ** no
30fa0 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61  t the SQLITE_Rea
30fb0 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
30fc0 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61  g is set (the ta
30fd0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
30fe0 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65  ge.  ** 1 is tre
30ff0 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61  ated as a specia
31000 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54  l case by queryT
31010 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c  ableLock() and l
31020 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a  ockTable())..  *
31030 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61  /.  rc = queryTa
31040 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45  bleLock(p, 1, RE
31050 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
31060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31070 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
31080 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
31090 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
310a0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
310b0 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
310c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
310d0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
310e0 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , 1, &pDbPage);.
310f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31100 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
31110 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
31120 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d   rc;.  }.  pP1 =
31130 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
31140 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
31150 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
31160 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62    *pMeta = get4b
31170 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
31180 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  x*4]);.  sqlite3
31190 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
311a0 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75  ge);..  /* If au
311b0 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69  tovacuumed is di
311c0 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  sabled in this b
311d0 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20  uild but we are 
311e0 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20  trying to .  ** 
311f0 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61  access an autova
31200 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c  cuumed database,
31210 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64   then make the d
31220 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79  atabase readonly
31230 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  . .  */.#ifdef S
31240 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31250 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d  ACUUM.  if( idx=
31260 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29  =4 && *pMeta>0 )
31270 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
31280 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   1;.#endif..  /*
31290 20 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c   Grab the read-l
312a0 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  ock on page 1. *
312b0 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62  /.  rc = lockTab
312c0 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  le(p, 1, READ_LO
312d0 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  CK);.  sqlite3Bt
312e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
312f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31300 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e  ** Write meta-in
31310 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69  formation back i
31320 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
31330 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a  .  Meta[0] is.**
31340 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d   read-only and m
31350 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ay not be writte
31360 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
31370 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
31380 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
31390 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a  dx, u32 iMeta){.
313a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
313b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
313c0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
313d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
313e0 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64  rt( idx>=1 && id
313f0 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74  x<=15 );.  sqlit
31400 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
31410 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
31420 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  db;.  if( p->inT
31430 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
31440 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42  E ){.    rc = pB
31450 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
31460 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
31470 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
31480 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
31490 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  t( pBt->pPage1!=
314a0 30 20 29 3b 0a 20 20 20 20 70 50 31 20 3d 20 70  0 );.    pP1 = p
314b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
314c0 61 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  a;.    rc = sqli
314d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
314e0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
314f0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
31500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31510 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
31520 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69  1[36 + idx*4], i
31530 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  Meta);.#ifndef S
31540 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31550 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
31560 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  idx==7 ){.      
31570 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
31580 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65  utoVacuum || iMe
31590 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ta==0 );.       
315a0 20 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d   assert( iMeta==
315b0 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b  0 || iMeta==1 );
315c0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
315d0 63 72 56 61 63 75 75 6d 20 3d 20 69 4d 65 74 61  crVacuum = iMeta
315e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
315f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
31600 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
31610 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
31620 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
31630 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74  the flag byte at
31640 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
31650 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
31660 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  the cursor.** is
31670 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
31680 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
31690 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
316a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
316b0 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
316c0 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52  t about CURSOR_R
316d0 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
316e0 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20  ? Probably need 
316f0 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73  to call.  ** res
31700 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
31710 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  on() here..  */.
31720 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31730 3b 0a 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ;.  restoreCurso
31740 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
31750 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
31760 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
31770 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
31780 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
31790 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
317a0 3d 3d 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20  ==pCur->pBt );. 
317b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20   return pPage ? 
317c0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
317d0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a  ge->hdrOffset] :
317e0 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65   0;.}.../*.** Re
317f0 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61  turn the pager a
31800 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
31810 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f   BTree.  This ro
31820 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
31830 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
31840 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
31850 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74  .*/.Pager *sqlit
31860 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74 72  e3BtreePager(Btr
31870 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
31880 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b   p->pBt->pPager;
31890 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
318a0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
318b0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70  Y_CHECK./*.** Ap
318c0 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74  pend a message t
318d0 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
318e0 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  age string..*/.s
318f0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
31900 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74  AppendMsg(.  Int
31910 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
31920 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c  ,.  char *zMsg1,
31930 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31940 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b  Format,.  ....){
31950 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
31960 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78   if( !pCheck->mx
31970 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
31980 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b  pCheck->mxErr--;
31990 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b  .  pCheck->nErr+
319a0 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  +;.  va_start(ap
319b0 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66  , zFormat);.  if
319c0 28 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  ( pCheck->errMsg
319d0 2e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20 73 71  .nChar ){.    sq
319e0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
319f0 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72  end(&pCheck->err
31a00 4d 73 67 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20  Msg, "\n", 1);. 
31a10 20 7d 0a 20 20 69 66 28 20 7a 4d 73 67 31 20 29   }.  if( zMsg1 )
31a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  {.    sqlite3Str
31a30 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43 68  AccumAppend(&pCh
31a40 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 7a 4d 73  eck->errMsg, zMs
31a50 67 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 73  g1, -1);.  }.  s
31a60 71 6c 69 74 65 33 56 58 50 72 69 6e 74 66 28 26  qlite3VXPrintf(&
31a70 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20  pCheck->errMsg, 
31a80 31 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  1, zFormat, ap);
31a90 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d  .  va_end(ap);.}
31aa0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31ab0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
31ac0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
31ad0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
31ae0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
31af0 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68  *.** Add 1 to th
31b00 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
31b10 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65  t for page iPage
31b20 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
31b30 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65  e second.** refe
31b40 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
31b50 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20  e, add an error 
31b60 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63  message to pChec
31b70 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52  k->zErrMsg..** R
31b80 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
31b90 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20   are 2 ore more 
31ba0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
31bb0 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a  e page and 0 if.
31bc0 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
31bd0 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63  e first referenc
31be0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a  e to the page..*
31bf0 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20  *.** Also check 
31c00 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
31c10 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64  mber is in bound
31c20 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
31c30 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72   checkRef(Integr
31c40 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69  ityCk *pCheck, i
31c50 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a  nt iPage, char *
31c60 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28  zContext){.  if(
31c70 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   iPage==0 ) retu
31c80 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67  rn 1;.  if( iPag
31c90 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20  e>pCheck->nPage 
31ca0 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20  || iPage<0 ){.  
31cb0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
31cc0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
31cd0 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65  t, "invalid page
31ce0 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61   number %d", iPa
31cf0 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
31d00 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68  1;.  }.  if( pCh
31d10 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
31d20 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63  ]==1 ){.    chec
31d30 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31d40 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e  k, zContext, "2n
31d50 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  d reference to p
31d60 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
31d70 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
31d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43   }.  return  (pC
31d90 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
31da0 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e  e]++)>1;.}..#ifn
31db0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31dc0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
31dd0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
31de0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
31df0 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67  nter-map for pag
31e00 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f  e iChild maps to
31e10 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e   .** page iParen
31e20 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20  t, pointer type 
31e30 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c  ptrType. If not,
31e40 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72   append an error
31e50 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70   message.** to p
31e60 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Check..*/.static
31e70 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61   void checkPtrma
31e80 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  p(.  IntegrityCk
31e90 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49   *pCheck,   /* I
31ea0 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 63  ntegrity check c
31eb0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f  ontext */.  Pgno
31ec0 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20   iChild,        
31ed0 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65     /* Child page
31ee0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20   number */.  u8 
31ef0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
31f00 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
31f10 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65  pointer map type
31f20 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65   */.  Pgno iPare
31f30 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt,          /* 
31f40 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
31f50 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65   map parent page
31f60 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
31f70 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20  r *zContext     
31f80 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64      /* Context d
31f90 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64  escription (used
31fa0 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20   for error msg) 
31fb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
31fc0 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70 65    u8 ePtrmapType
31fd0 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  ;.  Pgno iPtrmap
31fe0 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20  Parent;..  rc = 
31ff0 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b  ptrmapGet(pCheck
32000 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26  ->pBt, iChild, &
32010 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50  ePtrmapType, &iP
32020 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
32030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32040 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  K ){.    checkAp
32050 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32060 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65  zContext, "Faile
32070 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70  d to read ptrmap
32080 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64   key=%d", iChild
32090 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
320a0 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61   }..  if( ePtrma
320b0 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20  pType!=eType || 
320c0 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69  iPtrmapParent!=i
320d0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68  Parent ){.    ch
320e0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
320f0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  eck, zContext, .
32100 20 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d        "Bad ptr m
32110 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20  ap entry key=%d 
32120 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29  expected=(%d,%d)
32130 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a   got=(%d,%d)", .
32140 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54        iChild, eT
32150 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50  ype, iParent, eP
32160 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d  trmapType, iPtrm
32170 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d  apParent);.  }.}
32180 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
32190 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
321a0 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
321b0 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72  st or of an over
321c0 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a  flow page list..
321d0 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
321e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
321f0 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69  es on the list i
32200 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  s N..*/.static v
32210 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20  oid checkList(. 
32220 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
32230 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72  heck,  /* Integr
32240 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e  ity checking con
32250 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  text */.  int is
32260 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20  FreeList,       
32270 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72  /* True for a fr
32280 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66  eelist.  False f
32290 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
322a0 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
322b0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
322c0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
322d0 66 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69  for first page i
322e0 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
322f0 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
32300 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
32310 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  d number of page
32320 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  s in the list */
32330 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  .  char *zContex
32340 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  t        /* Cont
32350 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
32360 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssages */.){.  i
32370 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65  nt i;.  int expe
32380 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20  cted = N;.  int 
32390 69 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a  iFirst = iPage;.
323a0 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30    while( N-- > 0
323b0 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72   && pCheck->mxEr
323c0 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  r ){.    DbPage 
323d0 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20  *pOvflPage;.    
323e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
323f0 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66  OvflData;.    if
32400 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20  ( iPage<1 ){.   
32410 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32420 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
32430 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64  xt,.         "%d
32440 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73   of %d pages mis
32450 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c  sing from overfl
32460 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ow list starting
32470 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20   at %d",.       
32480 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64     N+1, expected
32490 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20  , iFirst);.     
324a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
324b0 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70    if( checkRef(p
324c0 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43  Check, iPage, zC
324d0 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b  ontext) ) break;
324e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
324f0 50 61 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d  PagerGet(pCheck-
32500 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69  >pPager, (Pgno)i
32510 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65  Page, &pOvflPage
32520 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
32530 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32540 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69  , zContext, "fai
32550 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20  led to get page 
32560 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
32570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
32580 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20      pOvflData = 
32590 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
325a0 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
325b0 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b  Data(pOvflPage);
325c0 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c  .    if( isFreeL
325d0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
325e0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
325f0 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69  OvflData[4]);.#i
32600 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32610 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32620 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
32630 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
32640 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
32650 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50  trmap(pCheck, iP
32660 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
32670 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78  PAGE, 0, zContex
32680 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
32690 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70  if.      if( n>p
326a0 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62  Check->pBt->usab
326b0 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20  leSize/4-2 ){.  
326c0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
326d0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
326e0 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
326f0 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66    "freelist leaf
32700 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f   count too big o
32710 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  n page %d", iPag
32720 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b  e);.        N--;
32730 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32740 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
32750 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
32760 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61      Pgno iFreePa
32770 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
32780 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29  OvflData[8+i*4])
32790 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
327a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
327b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
327c0 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
327d0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
327e0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
327f0 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  p(pCheck, iFreeP
32800 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
32810 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78  PAGE, 0, zContex
32820 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
32830 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
32840 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
32850 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f  , iFreePage, zCo
32860 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
32870 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e  }.        N -= n
32880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32890 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
328a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
328b0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
328c0 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
328d0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
328e0 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67  -vacuum and iPag
328f0 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  e is not the las
32900 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  t.      ** page 
32910 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  in this overflow
32920 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61   list, check tha
32930 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
32940 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20  p entry for.    
32950 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
32960 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65 73 20  ng page matches 
32970 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  iPage..      */.
32980 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
32990 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
329a0 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20  m && N>0 ){.    
329b0 20 20 20 20 69 20 3d 20 67 65 74 34 62 79 74 65      i = get4byte
329c0 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20  (pOvflData);.   
329d0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
329e0 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d  (pCheck, i, PTRM
329f0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50  AP_OVERFLOW2, iP
32a00 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
32a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
32a20 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d  ndif.    iPage =
32a30 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44   get4byte(pOvflD
32a40 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
32a50 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
32a60 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  lPage);.  }.}.#e
32a70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32a80 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32a90 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
32aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
32ab0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
32ac0 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e  * Do various san
32ad0 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20  ity checks on a 
32ae0 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61  single page of a
32af0 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a   tree.  Return.*
32b00 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68  * the tree depth
32b10 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65  .  Root pages re
32b20 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73  turn 0.  Parents
32b30 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a   of root pages.*
32b40 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20  * return 1, and 
32b50 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a  so forth..** .**
32b60 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61 72   These checks ar
32b70 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e done:.**.**   
32b80 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65     1.  Make sure
32b90 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20   that cells and 
32ba0 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f  freeblocks do no
32bb0 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20  t overlap.**    
32bc0 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e        but combin
32bd0 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
32be0 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a  cover the page..
32bf0 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65  **  NO  2.  Make
32c00 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20   sure cell keys 
32c10 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a  are in order..**
32c20 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73    NO  3.  Make s
32c30 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65  ure no key is le
32c40 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
32c50 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e   to zLowerBound.
32c60 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b  .**  NO  4.  Mak
32c70 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
32c80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
32c90 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72   equal to zUpper
32ca0 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35  Bound..**      5
32cb0 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  .  Check the int
32cc0 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c  egrity of overfl
32cd0 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20  ow pages..**    
32ce0 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c    6.  Recursivel
32cf0 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65  y call checkTree
32d00 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c  Page on all chil
32d10 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e  dren..**      7.
32d20 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
32d30 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63  e depth of all c
32d40 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73  hildren is the s
32d50 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20  ame..**      8. 
32d60 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
32d70 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73 74  page is at least
32d80 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73   33% full or els
32d90 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20  e it is.**      
32da0 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20      the root of 
32db0 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  the tree..*/.sta
32dc0 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65  tic int checkTre
32dd0 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69  ePage(.  Integri
32de0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
32df0 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  * Context for th
32e00 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a  e sanity check *
32e10 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
32e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
32e30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
32e40 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  page to check */
32e50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
32e60 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
32e70 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61  nt page */.  cha
32e80 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  r *zParentContex
32e90 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e  t  /* Parent con
32ea0 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  text */.){.  Mem
32eb0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69  Page *pPage;.  i
32ec0 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c  nt i, rc, depth,
32ed0 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a   d2, pgno, cnt;.
32ee0 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53    int hdr, cellS
32ef0 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  tart;.  int nCel
32f00 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  l;.  u8 *data;. 
32f10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
32f20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
32f30 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78  ;.  char zContex
32f40 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a  t[100];.  char *
32f50 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  hit;..  sqlite3_
32f60 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32f70 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74  zContext), zCont
32f80 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20 22  ext, "Page %d: "
32f90 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20  , iPage);..  /* 
32fa0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
32fb0 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a  age exists.  */.
32fc0 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e    pBt = pCheck->
32fd0 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  pBt;.  usableSiz
32fe0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
32ff0 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65  ize;.  if( iPage
33000 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
33010 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70    if( checkRef(p
33020 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50  Check, iPage, zP
33030 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20  arentContext) ) 
33040 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
33050 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
33060 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28  eeGetPage(pBt, (
33070 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61  Pgno)iPage, &pPa
33080 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20  ge, 0))!=0 ){.  
33090 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
330a0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
330b0 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62 6c  t,.       "unabl
330c0 65 20 74 6f 20 67 65 74 20 74 68 65 20 70 61 67  e to get the pag
330d0 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64  e. error code=%d
330e0 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74 75  ", rc);.    retu
330f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
33100 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
33110 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
33120 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20 29  , pParent))!=0 )
33130 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
33140 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
33150 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20  ntext, .        
33160 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c 69             "sqli
33170 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
33180 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72  () returns error
33190 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a   code %d", rc);.
331a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
331b0 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
331c0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
331d0 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68  Check out all th
331e0 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  e cells..  */.  
331f0 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72  depth = 0;.  for
33200 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
33210 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e  Cell && pCheck->
33220 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
33230 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
33240 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c  int sz;.    Cell
33250 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20  Info info;..    
33260 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61 64  /* Check payload
33270 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
33280 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
33290 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
332a0 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
332b0 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
332c0 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20 70 61       "On tree pa
332d0 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22  ge %d cell %d: "
332e0 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  , iPage, i);.   
332f0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
33300 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20 20  l(pPage,i);.    
33310 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
33320 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
33330 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
33340 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61     sz = info.nDa
33350 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  ta;.    if( !pPa
33360 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20  ge->intKey ) sz 
33370 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  += info.nKey;.  
33380 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e    assert( sz==in
33390 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
333a0 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e     if( sz>info.n
333b0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  Local ){.      i
333c0 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d  nt nPage = (sz -
333d0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75   info.nLocal + u
333e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28  sableSize - 5)/(
333f0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
33400 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
33410 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
33420 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
33430 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66  rflow]);.#ifndef
33440 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33450 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
33460 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
33470 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
33480 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
33490 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
334a0 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61  P_OVERFLOW1, iPa
334b0 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
334c0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
334d0 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43      checkList(pC
334e0 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66  heck, 0, pgnoOvf
334f0 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65  l, nPage, zConte
33500 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xt);.    }..    
33510 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20  /* Check sanity 
33520 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61  of left child pa
33530 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
33540 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
33550 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  ){.      pgno = 
33560 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
33570 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33580 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33590 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
335a0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
335b0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
335c0 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50  (pCheck, pgno, P
335d0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61  TRMAP_BTREE, iPa
335e0 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
335f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
33600 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72      d2 = checkTr
33610 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70 67  eePage(pCheck,pg
33620 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78  no,pPage,zContex
33630 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e  t);.      if( i>
33640 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20 29  0 && d2!=depth )
33650 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
33660 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
33670 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c   zContext, "Chil
33680 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69 66  d page depth dif
33690 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  fers");.      }.
336a0 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64 32        depth = d2
336b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
336c0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
336d0 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
336e0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
336f0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
33700 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 71  fset+8]);.    sq
33710 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
33720 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c  izeof(zContext),
33730 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
33740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33750 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20   "On page %d at 
33760 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20  right child: ", 
33770 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20  iPage);.#ifndef 
33780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33790 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
337a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
337b0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72  {.      checkPtr
337c0 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
337d0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
337e0 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  iPage, 0);.    }
337f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63  .#endif.    chec
33800 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
33810 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a  , pgno, pPage, z
33820 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a  Context);.  }. .
33830 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
33840 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65  omplete coverage
33850 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a   of the page.  *
33860 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  /.  data = pPage
33870 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
33880 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
33890 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74  t;.  hit = sqlit
338a0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
338b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
338c0 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20   if( hit ){.    
338d0 6d 65 6d 73 65 74 28 68 69 74 2c 20 30 2c 20 75  memset(hit, 0, u
338e0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
338f0 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20   memset(hit, 1, 
33900 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
33910 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65  dr+5]));.    nCe
33920 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
33930 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
33940 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72   cellStart = hdr
33950 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
33960 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69  >leaf;.    for(i
33970 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
33980 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20  ){.      int pc 
33990 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
339a0 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29  [cellStart+i*2])
339b0 3b 0a 20 20 20 20 20 20 75 31 36 20 73 69 7a 65  ;.      u16 size
339c0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
339d0 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
339e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
339f0 20 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a       if( (pc+siz
33a00 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
33a10 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20   || pc<0 ){.    
33a20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
33a30 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
33a40 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
33a50 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
33a60 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
33a70 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
33a80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
33a90 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63          for(j=pc
33aa0 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20  +size-1; j>=pc; 
33ab0 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
33ac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
33ad0 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65   for(cnt=0, i=ge
33ae0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
33af0 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75  +1]); i>0 && i<u
33b00 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74  sableSize && cnt
33b10 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20  <10000; .       
33b20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20      cnt++){.    
33b30 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74    int size = get
33b40 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d  2byte(&data[i+2]
33b50 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
33b60 20 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a        if( (i+siz
33b70 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
33b80 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20   || i<0 ){.     
33b90 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33ba0 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20  g(pCheck, 0,  . 
33bb0 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
33bc0 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
33bd0 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
33be0 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
33bf0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
33c00 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
33c10 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d  size-1; j>=i; j-
33c20 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
33c30 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67     }.      i = g
33c40 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d  et2byte(&data[i]
33c50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
33c60 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62  (i=cnt=0; i<usab
33c70 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  leSize; i++){.  
33c80 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d      if( hit[i]==
33c90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74  0 ){.        cnt
33ca0 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
33cb0 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a  if( hit[i]>1 ){.
33cc0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
33cd0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
33ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c  ,.          "Mul
33cf0 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62  tiple uses for b
33d00 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25  yte %d of page %
33d10 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20  d", i, iPage);. 
33d20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
33d40 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64  if( cnt!=data[hd
33d50 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68  r+7] ){.      ch
33d60 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
33d70 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
33d80 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73     "Fragmented s
33d90 70 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20  pace is %d byte 
33da0 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f  reported as %d o
33db0 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20  n page %d",.    
33dc0 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b        cnt, data[
33dd0 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a  hdr+7], iPage);.
33de0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
33df0 74 65 33 50 61 67 65 46 72 65 65 28 68 69 74 29  te3PageFree(hit)
33e00 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
33e10 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
33e20 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e  n depth+1;.}.#en
33e30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
33e40 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
33e50 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
33e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
33e70 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
33e80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
33e90 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68  es a complete ch
33ea0 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eck of the given
33eb0 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52   BTree file.  aR
33ec0 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61  oot[] is.** an a
33ed0 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75  rray of pages nu
33ee0 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20  mbers were each 
33ef0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74  page number is t
33f00 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a  he root page of.
33f10 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f  ** a table.  nRo
33f20 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ot is the number
33f30 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
33f40 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Root..**.** If e
33f50 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73  verything checks
33f60 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69   out, this routi
33f70 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
33f80 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69    If something i
33f90 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65  s.** amiss, an e
33fa0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
33fb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
33fc0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
33fd0 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e  m malloc().** an
33fe0 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
33ff0 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67  hat error messag
34000 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
34010 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
34020 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
34030 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
34040 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
34050 73 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  sage when it is 
34060 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  done..*/.char *s
34070 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
34080 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72  rityCheck(.  Btr
34090 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68  ee *p,     /* Th
340a0 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 63 68  e btree to be ch
340b0 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  ecked */.  int *
340c0 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61  aRoot,   /* An a
340d0 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67  rray of root pag
340e0 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69  es numbers for i
340f0 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65 73 20  ndividual trees 
34100 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20  */.  int nRoot, 
34110 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
34120 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74  entries in aRoot
34130 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72  [] */.  int mxEr
34140 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65  r,    /* Stop re
34150 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61  porting errors a
34160 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a  fter this many *
34170 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20  /.  int *pnErr  
34180 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65    /* Write numbe
34190 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
341a0 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c   to this variabl
341b0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
341c0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49  .  int nRef;.  I
341d0 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68 65 63  ntegrityCk sChec
341e0 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  k;.  BtShared *p
341f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 63  Bt = p->pBt;.  c
34200 68 61 72 20 7a 45 72 72 5b 31 30 30 5d 3b 0a 0a  har zErr[100];..
34210 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
34220 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
34230 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52 65  b = p->db;.  nRe
34240 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
34250 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
34260 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63  ager);.  if( loc
34270 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
34280 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  p)!=SQLITE_OK ){
34290 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
342a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
342b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
342c0 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61  Dup("Unable to a
342d0 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f  cquire a read lo
342e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
342f0 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65  se");.  }.  sChe
34300 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  ck.pBt = pBt;.  
34310 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20  sCheck.pPager = 
34320 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pBt->pPager;.  s
34330 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 61  Check.nPage = pa
34340 67 65 72 50 61 67 65 63 6f 75 6e 74 28 73 43 68  gerPagecount(sCh
34350 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20 73  eck.pPager);.  s
34360 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78  Check.mxErr = mx
34370 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45  Err;.  sCheck.nE
34380 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72  rr = 0;.  *pnErr
34390 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
343a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
343b0 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
343c0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
343d0 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20   sCheck.nPage = 
343e0 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d  pBt->nTrunc;.  }
343f0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43  .#endif.  if( sC
34400 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b  heck.nPage==0 ){
34410 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
34420 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
34430 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
34440 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
34450 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
34460 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
34470 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68 65  te3Malloc( (sChe
34480 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65  ck.nPage+1)*size
34490 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  of(sCheck.anRef[
344a0 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43  0]) );.  if( !sC
344b0 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20  heck.anRef ){.  
344c0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
344d0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
344e0 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20  *pnErr = 1;.    
344f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
34500 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
34510 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
34520 70 2d 3e 64 62 2c 20 22 55 6e 61 62 6c 65 20 74  p->db, "Unable t
34530 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74 65  o malloc %d byte
34540 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73 43  s", .        (sC
34550 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
34560 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
34570 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f  f[0]));.  }.  fo
34580 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b  r(i=0; i<=sCheck
34590 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43  .nPage; i++){ sC
345a0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
345b0 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49  0; }.  i = PENDI
345c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
345d0 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65  );.  if( i<=sChe
345e0 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  ck.nPage ){.    
345f0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
34600 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
34610 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
34620 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 2c 20 7a  sCheck.errMsg, z
34630 45 72 72 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72  Err, sizeof(zErr
34640 29 2c 20 32 30 30 30 30 29 3b 0a 0a 20 20 2f 2a  ), 20000);..  /*
34650 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
34660 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
34670 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63  list.  */.  chec
34680 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31  kList(&sCheck, 1
34690 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  , get4byte(&pBt-
346a0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
346b0 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2]),.           
346c0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
346d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
346e0 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69  ]), "Main freeli
346f0 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68  st: ");..  /* Ch
34700 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c  eck all the tabl
34710 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
34720 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73  =0; i<nRoot && s
34730 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
34740 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74  ){.    if( aRoot
34750 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
34760 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
34770 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34780 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
34790 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f  utoVacuum && aRo
347a0 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  ot[i]>1 ){.     
347b0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43   checkPtrmap(&sC
347c0 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
347d0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
347e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   0, 0);.    }.#e
347f0 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72  ndif.    checkTr
34800 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20  eePage(&sCheck, 
34810 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69  aRoot[i], 0, "Li
34820 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73  st of tree roots
34830 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  : ");.  }..  /* 
34840 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20  Make sure every 
34850 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
34860 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20   is referenced. 
34870 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
34880 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26  <=sCheck.nPage &
34890 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
348a0 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  i++){.#ifdef SQL
348b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
348c0 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65  UUM.    if( sChe
348d0 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29  ck.anRef[i]==0 )
348e0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
348f0 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
34900 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
34910 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
34920 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
34930 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
34940 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
34950 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75  -vacuum, make su
34960 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e  re no tables con
34970 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65  tain.    ** refe
34980 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65  rences to pointe
34990 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20  r-map pages..   
349a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65   */.    if( sChe
349b0 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26  ck.anRef[i]==0 &
349c0 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
349d0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
349e0 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74  !=i || !pBt->aut
349f0 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
34a00 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34a10 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
34a20 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
34a30 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
34a40 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
34a50 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20  nRef[i]!=0 && . 
34a60 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
34a70 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20  GENO(pBt, i)==i 
34a80 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  && pBt->autoVacu
34a90 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
34aa0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
34ab0 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72  eck, 0, "Pointer
34ac0 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20   map page %d is 
34ad0 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b  referenced", i);
34ae0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
34af0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
34b00 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20  e this analysis 
34b10 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e  did not leave an
34b20 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a  y unref() pages.
34b30 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72    */.  unlockBtr
34b40 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
34b50 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73  .  if( nRef != s
34b60 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
34b70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
34b80 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
34b90 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
34ba0 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74  0, .      "Outst
34bb0 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e  anding page coun
34bc0 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74  t goes from %d t
34bd0 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73  o %d during this
34be0 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20   analysis",.    
34bf0 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50    nRef, sqlite3P
34c00 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
34c10 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  ->pPager).    );
34c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
34c30 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20    up and report 
34c40 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73  errors..  */.  s
34c50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34c60 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
34c70 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  ree(sCheck.anRef
34c80 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43  );.  *pnErr = sC
34c90 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69 66 28  heck.nErr;.  if(
34ca0 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d 30 20   sCheck.nErr==0 
34cb0 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
34cc0 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65  mReset(&sCheck.e
34cd0 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e  rrMsg);.  return
34ce0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
34cf0 46 69 6e 69 73 68 28 26 73 43 68 65 63 6b 2e 65  Finish(&sCheck.e
34d00 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64 69 66  rrMsg);.}.#endif
34d10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
34d20 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
34d30 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
34d40 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
34d50 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  me of the underl
34d60 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
34d70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
34d80 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  ger filename is 
34d90 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
34da0 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
34db0 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
34dc0 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
34dd0 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
34de0 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
34df0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
34e00 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
34e10 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
34e20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
34e30 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
34e40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
34e50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
34e60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
34e70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
34e80 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
34e90 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
34ea0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
34eb0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
34ec0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64 69 72  ** The pager dir
34ed0 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73 20 69  ectory name is i
34ee0 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67  nvariant as long
34ef0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73   as the pager is
34f00 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69  .** open so it i
34f10 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73  s safe to access
34f20 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53   without the BtS
34f30 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  hared mutex..*/.
34f40 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
34f50 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61  te3BtreeGetDirna
34f60 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
34f70 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
34f80 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
34f90 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
34fa0 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74  erDirname(p->pBt
34fb0 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
34fc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
34fd0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
34fe0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
34ff0 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54  this database. T
35000 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
35010 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ue of this routi
35020 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72  ne is the same r
35030 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
35040 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
35050 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
35060 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74  n created or not
35070 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
35080 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
35090 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
350a0 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
350b0 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
350c0 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
350d0 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
350e0 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
350f0 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
35100 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
35110 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74  etJournalname(Bt
35120 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
35130 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
35140 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
35150 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
35160 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  rnalname(p->pBt-
35170 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66  >pPager);.}..#if
35180 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35190 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f  _VACUUM./*.** Co
351a0 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  py the complete 
351b0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72  content of pBtFr
351c0 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20  om into pBtTo.  
351d0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  A transaction.**
351e0 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
351f0 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a  for both files..
35200 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
35210 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79 20 62  f file pTo may b
35220 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69  e reduced by thi
35230 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  s operation..** 
35240 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
35250 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e   wrong, the tran
35260 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69  saction on pTo i
35270 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a  s rolled back. .
35280 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
35290 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65  ful, CommitPhase
352a0 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63 61 6c  One() may be cal
352b0 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72  led on pTo befor
352c0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a  e returning. .**
352d0 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
352e0 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74  ld finish commit
352f0 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ting the transac
35300 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63  tion on pTo by c
35310 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
35320 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a  3BtreeCommit()..
35330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
35340 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65  reeCopyFile(Btre
35350 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70  e *pTo, Btree *p
35360 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20  From){.  int rc 
35370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
35380 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e  gno i;..  Pgno n
35390 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a  FromPage;     /*
353a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
353b0 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50   in pFrom */.  P
353c0 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20 20  gno nToPage;    
353d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
353e0 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a  pages in pTo */.
353f0 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b    Pgno nNewPage;
35400 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35410 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20  of pages in pTo 
35420 61 66 74 65 72 20 74 68 65 20 63 6f 70 79 20 2a  after the copy *
35430 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b  /..  Pgno iSkip;
35440 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64           /* Pend
35450 69 6e 67 20 62 79 74 65 20 70 61 67 65 20 69 6e  ing byte page in
35460 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54   pTo */.  int nT
35470 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a  oPageSize;    /*
35480 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 54   Page size of pT
35490 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  o in bytes */.  
354a0 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  int nFromPageSiz
354b0 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  e;  /* Page size
354c0 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62 79 74   of pFrom in byt
354d0 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65  es */..  BtShare
354e0 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e  d *pBtTo = pTo->
354f0 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pBt;.  BtShared 
35500 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  *pBtFrom = pFrom
35510 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e  ->pBt;.  pBtTo->
35520 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20  db = pTo->db;.  
35530 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46  pBtFrom->db = pF
35540 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50  rom->db;..  nToP
35550 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d  ageSize = pBtTo-
35560 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72  >pageSize;.  nFr
35570 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  omPageSize = pBt
35580 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  From->pageSize;.
35590 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72  .  if( pTo->inTr
355a0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
355b0 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61   || pFrom->inTra
355c0 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
355d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
355e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
355f0 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75    if( pBtTo->pCu
35600 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
35610 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
35620 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d    }..  nToPage =
35630 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
35640 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
35650 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d 20 70 61    nFromPage = pa
35660 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
35670 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20  From->pPager);. 
35680 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47   iSkip = PENDING
35690 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f  _BYTE_PAGE(pBtTo
356a0 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
356b0 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74 68  e nNewPage is th
356c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
356d0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
356e0 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  ore the.  ** con
356f0 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 75  tents of pFrom u
35700 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
35710 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54   page-size of pT
35720 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61  o..  */.  nNewPa
35730 67 65 20 3d 20 28 28 69 36 34 29 6e 46 72 6f 6d  ge = ((i64)nFrom
35740 50 61 67 65 20 2a 20 28 69 36 34 29 6e 46 72 6f  Page * (i64)nFro
35750 6d 50 61 67 65 53 69 7a 65 20 2b 20 28 69 36 34  mPageSize + (i64
35760 29 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 31  )nToPageSize - 1
35770 29 20 2f 20 0a 20 20 20 20 20 20 28 69 36 34 29  ) / .      (i64)
35780 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  nToPageSize;..  
35790 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
357a0 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54  ITE_OK && (i<=nT
357b0 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77  oPage || i<=nNew
357c0 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20  Page); i++){..  
357d0 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65    /* Journal the
357e0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a   original page..
357f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53      **.    ** iS
35800 6b 69 70 20 69 73 20 74 68 65 20 70 61 67 65 20  kip is the page 
35810 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 6f  number of the lo
35820 63 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e 44  cking page (PEND
35830 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a 20  ING_BYTE_PAGE). 
35840 20 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73     ** in databas
35850 65 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20 74  e *pTo (before t
35860 68 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20 70  he copy). This p
35870 61 67 65 20 69 73 20 6e 65 76 65 72 20 77 72 69  age is never wri
35880 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74  tten .    ** int
35890 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
358a0 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53  le. Unless i==iS
358b0 6b 69 70 20 6f 72 20 74 68 65 20 70 61 67 65 20  kip or the page 
358c0 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70  was not.    ** p
358d0 72 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62 65  resent in pTo be
358e0 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 70  fore the copy op
358f0 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c  eration, journal
35900 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54 6f   page i from pTo
35910 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35920 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d   i!=iSkip && i<=
35930 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20  nToPage ){.     
35940 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
35950 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
35960 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
35970 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
35980 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  i, &pDbPage);.  
35990 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
359a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
359b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
359c0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
359d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
359e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
359f0 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20  >nFromPage ){.  
35a00 20 20 20 20 20 20 20 20 2f 2a 20 59 65 61 68 2e          /* Yeah.
35a10 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72 64    It seems wierd
35a20 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69   to call DontWri
35a30 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65 72  te() right after
35a40 20 57 72 69 74 65 28 29 2e 20 42 75 74 0a 20 20   Write(). But.  
35a50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
35a60 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 6e  is because the n
35a70 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72  ames of those pr
35a80 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20  ocedures do not 
35a90 65 78 61 63 74 6c 79 20 0a 20 20 20 20 20 20 20  exactly .       
35aa0 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20     ** represent 
35ab0 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20 57  what they do.  W
35ac0 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d 65  rite() really me
35ad0 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70 61  ans "put this pa
35ae0 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ge in the.      
35af0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
35b00 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b  journal and mark
35b10 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20   it as dirty so 
35b20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
35b30 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
35b40 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
35b50 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e  base file later.
35b60 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75  "  DontWrite() u
35b70 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64  ndoes the second
35b80 20 70 61 72 74 20 6f 66 0a 20 20 20 20 20 20 20   part of.       
35b90 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70     ** that and p
35ba0 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
35bb0 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
35bc0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
35bd0 61 73 65 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ase. The.       
35be0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74     ** page is st
35bf0 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  ill on the rollb
35c00 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f  ack journal, tho
35c10 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69  ugh.  And that i
35c20 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  s the .         
35c30 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e 74 20   ** whole point 
35c40 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a 20 74  of this block: t
35c50 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20 74  o put pages on t
35c60 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
35c70 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20 20 20 20  nal. .          
35c80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
35c90 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
35ca0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
35cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
35cc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35cd0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
35ce0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
35cf0 20 4f 76 65 72 77 72 69 74 65 20 74 68 65 20 64   Overwrite the d
35d00 61 74 61 20 69 6e 20 70 61 67 65 20 69 20 6f 66  ata in page i of
35d10 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
35d20 62 61 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  base */.    if( 
35d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35d40 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d   i!=iSkip && i<=
35d50 6e 4e 65 77 50 61 67 65 20 29 7b 0a 0a 20 20 20  nNewPage ){..   
35d60 20 20 20 44 62 50 61 67 65 20 2a 70 54 6f 50 61     DbPage *pToPa
35d70 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ge = 0;.      sq
35d80 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
35d90 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
35da0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
35db0 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
35dc0 26 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20  &pToPage);.     
35dd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
35df0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35e00 72 69 74 65 28 70 54 6f 50 61 67 65 29 3b 0a 20  rite(pToPage);. 
35e10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
35e20 72 28 0a 20 20 20 20 20 20 20 20 69 4f 66 66 3d  r(.        iOff=
35e30 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a  (i-1)*nToPageSiz
35e40 65 3b 20 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  e; .        rc==
35e50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
35e60 66 3c 69 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b  f<i*nToPageSize;
35e70 20 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b   .        iOff +
35e80 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a  = nFromPageSize.
35e90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35ea0 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61   DbPage *pFromPa
35eb0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
35ec0 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f  Pgno iFrom = (iO
35ed0 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  ff/nFromPageSize
35ee0 29 2b 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  )+1;..        if
35ef0 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47  ( iFrom==PENDING
35f00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 46 72  _BYTE_PAGE(pBtFr
35f10 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  om) ){.         
35f20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35f30 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
35f40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
35f50 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  et(pBtFrom->pPag
35f60 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f  er, iFrom, &pFro
35f70 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
35f80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35f90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  K ){.          c
35fa0 68 61 72 20 2a 7a 54 6f 20 3d 20 73 71 6c 69 74  har *zTo = sqlit
35fb0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
35fc0 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ToPage);.       
35fd0 20 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d     char *zFrom =
35fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
35ff0 44 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b  Data(pFromPage);
36000 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
36010 43 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20 20 20  Copy;..         
36020 20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69   if( nFromPageSi
36030 7a 65 3e 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20  ze>=nToPageSize 
36040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
36050 46 72 6f 6d 20 2b 3d 20 28 28 69 2d 31 29 2a 6e  From += ((i-1)*n
36060 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 28 28 69  ToPageSize - ((i
36070 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67  From-1)*nFromPag
36080 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
36090 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 54 6f       nCopy = nTo
360a0 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  PageSize;.      
360b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
360c0 20 20 20 20 20 20 20 7a 54 6f 20 2b 3d 20 28 28         zTo += ((
360d0 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50  (iFrom-1)*nFromP
360e0 61 67 65 53 69 7a 65 29 20 2d 20 28 69 2d 31 29  ageSize) - (i-1)
360f0 2a 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b 0a 20  *nToPageSize);. 
36100 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
36110 20 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65   = nFromPageSize
36120 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
36130 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
36140 7a 54 6f 2c 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70  zTo, zFrom, nCop
36150 79 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 50 61  y);..  sqlite3Pa
36160 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61  gerUnref(pFromPa
36170 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
36180 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
36190 28 20 70 54 6f 50 61 67 65 20 29 20 73 71 6c 69  ( pToPage ) sqli
361a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54  te3PagerUnref(pT
361b0 6f 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oPage);.    }.  
361c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 6e 67  }..  /* If thing
361d0 73 20 68 61 76 65 20 77 6f 72 6b 65 64 20 73 6f  s have worked so
361e0 20 66 61 72 2c 20 74 68 65 20 64 61 74 61 62 61   far, the databa
361f0 73 65 20 66 69 6c 65 20 6d 61 79 20 6e 65 65 64  se file may need
36200 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 74 72 75   to be .  ** tru
36210 6e 63 61 74 65 64 2e 20 54 68 65 20 63 6f 6d 70  ncated. The comp
36220 6c 65 78 20 70 61 72 74 20 69 73 20 74 68 61 74  lex part is that
36230 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
36240 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  be truncated to.
36250 20 20 2a 2a 20 61 20 73 69 7a 65 20 74 68 61 74    ** a size that
36260 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
36270 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 6e  er multiple of n
36280 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 74 68 65  ToPageSize - the
36290 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61   current.  ** pa
362a0 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
362b0 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
362c0 61 74 65 64 20 77 69 74 68 20 42 2d 54 72 65 65  ated with B-Tree
362d0 20 70 54 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   pTo..  **.  ** 
362e0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 61 79  For example, say
362f0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
36300 66 20 70 54 6f 20 69 73 20 32 30 34 38 20 62 79  f pTo is 2048 by
36310 74 65 73 20 61 6e 64 20 74 68 65 20 6f 72 69 67  tes and the orig
36320 69 6e 61 6c 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  inal .  ** numbe
36330 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 35 20  r of pages is 5 
36340 28 31 30 20 4b 42 20 66 69 6c 65 29 2e 20 49 66  (10 KB file). If
36350 20 70 46 72 6f 6d 20 68 61 73 20 61 20 70 61 67   pFrom has a pag
36360 65 20 73 69 7a 65 20 6f 66 20 31 30 32 34 20 0a  e size of 1024 .
36370 20 20 2a 2a 20 62 79 74 65 73 20 61 6e 64 20 39    ** bytes and 9
36380 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
36390 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
363a0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 39  e truncated to 9
363b0 4b 42 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  KB..  */.  if( r
363c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
363d0 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67      if( nFromPag
363e0 65 53 69 7a 65 21 3d 6e 54 6f 50 61 67 65 53 69  eSize!=nToPageSi
363f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
36400 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
36410 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
36420 6c 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  le(pBtTo->pPager
36430 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 69  );.      i64 iSi
36440 7a 65 20 3d 20 28 69 36 34 29 6e 46 72 6f 6d 50  ze = (i64)nFromP
36450 61 67 65 53 69 7a 65 20 2a 20 28 69 36 34 29 6e  ageSize * (i64)n
36460 46 72 6f 6d 50 61 67 65 3b 0a 20 20 20 20 20 20  FromPage;.      
36470 69 36 34 20 69 4e 6f 77 20 3d 20 28 69 36 34 29  i64 iNow = (i64)
36480 28 28 6e 54 6f 50 61 67 65 3e 6e 4e 65 77 50 61  ((nToPage>nNewPa
36490 67 65 29 3f 6e 54 6f 50 61 67 65 3a 6e 4e 65 77  ge)?nToPage:nNew
364a0 50 61 67 65 29 20 2a 20 28 69 36 34 29 6e 54 6f  Page) * (i64)nTo
364b0 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
364c0 20 69 36 34 20 69 50 65 6e 64 69 6e 67 20 3d 20   i64 iPending = 
364d0 28 28 69 36 34 29 50 45 4e 44 49 4e 47 5f 42 59  ((i64)PENDING_BY
364e0 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29 2d 31  TE_PAGE(pBtTo)-1
364f0 29 20 2a 28 69 36 34 29 6e 54 6f 50 61 67 65 53  ) *(i64)nToPageS
36500 69 7a 65 3b 0a 20 20 0a 20 20 20 20 20 20 61 73  ize;.  .      as
36510 73 65 72 74 28 20 69 53 69 7a 65 3c 3d 69 4e 6f  sert( iSize<=iNo
36520 77 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  w );.  .      /*
36530 20 43 6f 6d 6d 69 74 20 70 68 61 73 65 20 6f 6e   Commit phase on
36540 65 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  e syncs the jour
36550 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  nal file associa
36560 74 65 64 20 77 69 74 68 20 70 54 6f 20 0a 20 20  ted with pTo .  
36570 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
36580 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  g the original d
36590 61 74 61 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  ata. It does not
365a0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
365b0 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
365c0 20 69 74 73 65 6c 66 2e 20 41 66 74 65 72 20 64   itself. After d
365d0 6f 69 6e 67 20 74 68 69 73 20 69 74 20 69 73 20  oing this it is 
365e0 73 61 66 65 20 74 6f 20 75 73 65 20 4f 73 54 72  safe to use OsTr
365f0 75 6e 63 61 74 65 28 29 20 61 6e 64 20 6f 74 68  uncate() and oth
36600 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
36610 20 41 50 49 73 20 6f 6e 20 74 68 65 20 64 61 74   APIs on the dat
36620 61 62 61 73 65 20 66 69 6c 65 20 64 69 72 65 63  abase file direc
36630 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tly..      */.  
36640 20 20 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20      pBtTo->db = 
36650 70 54 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 72  pTo->db;.      r
36660 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36670 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
36680 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 30 2c  BtTo->pPager, 0,
36690 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66   0, 1);.      if
366a0 28 20 69 53 69 7a 65 3c 69 4e 6f 77 20 26 26 20  ( iSize<iNow && 
366b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
366c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
366d0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
366e0 70 46 69 6c 65 2c 20 69 53 69 7a 65 29 3b 0a 20  pFile, iSize);. 
366f0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
36700 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74  /* The loop that
36710 20 63 6f 70 69 65 64 20 64 61 74 61 20 66 72 6f   copied data fro
36720 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d  m database pFrom
36730 20 74 6f 20 70 54 6f 20 64 69 64 20 6e 6f 74 0a   to pTo did not.
36740 20 20 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74        ** populat
36750 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
36760 67 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 70  ge of database p
36770 54 6f 2e 20 49 66 20 74 68 65 20 70 61 67 65 2d  To. If the page-
36780 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  size of.      **
36790 20 70 46 72 6f 6d 20 69 73 20 73 6d 61 6c 6c 65   pFrom is smalle
367a0 72 20 74 68 61 6e 20 74 68 61 74 20 6f 66 20 70  r than that of p
367b0 54 6f 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  To, this means s
367c0 6f 6d 65 20 64 61 74 61 20 77 69 6c 6c 0a 20 20  ome data will.  
367d0 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20      ** not have 
367e0 62 65 65 6e 20 63 6f 70 69 65 64 2e 20 0a 20 20  been copied. .  
367f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
36800 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65  This block copie
36810 73 20 74 68 65 20 6d 69 73 73 69 6e 67 20 64 61  s the missing da
36820 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  ta from database
36830 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 0a 20   pFrom to pTo . 
36840 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 66 69       ** using fi
36850 6c 65 20 41 50 49 73 2e 20 54 68 69 73 20 69 73  le APIs. This is
36860 20 73 61 66 65 20 62 65 63 61 75 73 65 20 61 74   safe because at
36870 20 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 6b   this point we k
36880 6e 6f 77 20 74 68 61 74 0a 20 20 20 20 20 20 2a  now that.      *
36890 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 72 69  * all of the ori
368a0 67 69 6e 61 6c 20 64 61 74 61 20 66 72 6f 6d 20  ginal data from 
368b0 70 54 6f 20 68 61 73 20 62 65 65 6e 20 73 79 6e  pTo has been syn
368c0 63 65 64 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ced into the .  
368d0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
368e0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
368f0 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 73  nt it would be s
36900 61 66 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69  afe to do anythi
36910 6e 67 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 61  ng at.      ** a
36920 6c 6c 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ll to the databa
36930 73 65 20 66 69 6c 65 20 65 78 63 65 70 74 20 74  se file except t
36940 72 75 6e 63 61 74 65 20 69 74 20 74 6f 20 7a 65  runcate it to ze
36950 72 6f 20 62 79 74 65 73 2e 0a 20 20 20 20 20 20  ro bytes..      
36960 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
36970 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 46  =SQLITE_OK && nF
36980 72 6f 6d 50 61 67 65 53 69 7a 65 3c 6e 54 6f 50  romPageSize<nToP
36990 61 67 65 53 69 7a 65 20 26 26 20 69 53 69 7a 65  ageSize && iSize
369a0 3e 69 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  >iPending){.    
369b0 20 20 20 20 69 36 34 20 69 4f 66 66 3b 0a 20 20      i64 iOff;.  
369c0 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20        for(.     
369d0 20 20 20 20 20 69 4f 66 66 3d 69 50 65 6e 64 69       iOff=iPendi
369e0 6e 67 3b 20 0a 20 20 20 20 20 20 20 20 20 20 72  ng; .          r
369f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36a00 69 4f 66 66 3c 28 69 50 65 6e 64 69 6e 67 2b 6e  iOff<(iPending+n
36a10 54 6f 50 61 67 65 53 69 7a 65 29 3b 20 0a 20 20  ToPageSize); .  
36a20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
36a30 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20  nFromPageSize.  
36a40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
36a50 20 20 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d     DbPage *pFrom
36a60 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
36a70 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d      Pgno iFrom =
36a80 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65   (iOff/nFromPage
36a90 53 69 7a 65 29 2b 31 3b 0a 20 20 0a 20 20 20 20  Size)+1;.  .    
36aa0 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
36ab0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
36ac0 47 45 28 70 42 74 46 72 6f 6d 29 20 7c 7c 20 69  GE(pBtFrom) || i
36ad0 46 72 6f 6d 3e 6e 46 72 6f 6d 50 61 67 65 20 29  From>nFromPage )
36ae0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
36af0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
36b00 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
36b10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36b20 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  erGet(pBtFrom->p
36b30 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70  Pager, iFrom, &p
36b40 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
36b50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36b60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36b70 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72 6f        char *zFro
36b80 6d 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  m = sqlite3Pager
36b90 47 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61 67  GetData(pFromPag
36ba0 65 29 3b 0a 20 20 09 20 20 72 63 20 3d 20 73 71  e);.  .  rc = sq
36bb0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 46 69  lite3OsWrite(pFi
36bc0 6c 65 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d  le, zFrom, nFrom
36bd0 50 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 29 3b  PageSize, iOff);
36be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
36bf0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
36c00 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
36c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
36c20 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
36c30 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
36c40 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
36c50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36c80 67 65 72 53 79 6e 63 28 70 42 74 54 6f 2d 3e 70  gerSync(pBtTo->p
36c90 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
36ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36cc0 65 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f  erTruncate(pBtTo
36cd0 2d 3e 70 50 61 67 65 72 2c 20 6e 4e 65 77 50 61  ->pPager, nNewPa
36ce0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
36cf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36d00 20 29 7b 0a 20 20 20 20 20 20 70 42 74 54 6f 2d   ){.      pBtTo-
36d10 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
36d20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
36d30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
36d40 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
36d50 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20  ack(pTo);.  }.. 
36d60 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
36d70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
36d80 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
36d90 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
36da0 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
36db0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
36dc0 72 28 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65  r(pTo);.  sqlite
36dd0 33 42 74 72 65 65 45 6e 74 65 72 28 70 46 72 6f  3BtreeEnter(pFro
36de0 6d 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  m);.  rc = btree
36df0 43 6f 70 79 46 69 6c 65 28 70 54 6f 2c 20 70 46  CopyFile(pTo, pF
36e00 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rom);.  sqlite3B
36e10 74 72 65 65 4c 65 61 76 65 28 70 46 72 6f 6d 29  treeLeave(pFrom)
36e20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
36e30 4c 65 61 76 65 28 70 54 6f 29 3b 0a 20 20 72 65  Leave(pTo);.  re
36e40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
36e50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
36e60 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  T_VACUUM */../*.
36e70 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
36e80 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ro if a transact
36e90 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
36ea0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
36eb0 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65  eeIsInTrans(Btre
36ec0 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
36ed0 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   p==0 || sqlite3
36ee0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
36ef0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
36f00 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
36f10 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
36f20 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  RITE));.}../*.**
36f30 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
36f40 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
36f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
36f60 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
36f70 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74  lite3BtreeIsInSt
36f80 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
36f90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
36fa0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
36fb0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ) );.  return (p
36fc0 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d  ->pBt && p->pBt-
36fd0 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  >inStmt);.}../*.
36fe0 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
36ff0 72 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72  ro if a read (or
37000 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
37010 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
37020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
37030 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
37040 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
37050 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
37060 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
37070 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
37080 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72  n (p && (p->inTr
37090 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29  ans!=TRANS_NONE)
370a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
370b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
370c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
370d0 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
370e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
370f0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72  ** a single shar
37100 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65  ed-btree. The me
37110 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20  mory is used by 
37120 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20  client code for 
37130 69 74 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f  its own.** purpo
37140 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  ses (for example
37150 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67  , to store a hig
37160 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61  h-level schema a
37170 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
37180 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ** the shared-bt
37190 72 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20  ree). The btree 
371a0 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65  layer manages re
371b0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67  ference counting
371c0 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   issues..**.** T
371d0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
371e0 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  is is called on 
371f0 61 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20  a shared-btree, 
37200 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20  nBytes bytes of 
37210 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c  memory.** are al
37220 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c  located, zeroed,
37230 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f   and returned to
37240 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72   the caller. For
37250 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
37260 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42   .** call the nB
37270 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
37280 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20  s ignored and a 
37290 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
372a0 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d  ame blob.** of m
372b0 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20  emory returned. 
372c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 42  .**.** If the nB
372d0 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
372e0 73 20 30 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  s 0 and the blob
372f0 20 6f 66 20 6d 65 6d 6f 72 79 20 68 61 73 20 6e   of memory has n
37300 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 61  ot yet been.** a
37310 6c 6c 6f 63 61 74 65 64 2c 20 61 20 6e 75 6c 6c  llocated, a null
37320 20 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75   pointer is retu
37330 72 6e 65 64 2e 20 49 66 20 74 68 65 20 62 6c 6f  rned. If the blo
37340 62 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  b has already be
37350 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c  en.** allocated,
37360 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
37370 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2a 0a 2a 2a  as normal..**.**
37380 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   Just before the
37390 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73   shared-btree is
373a0 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e   closed, the fun
373b0 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ction passed as 
373c0 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72  the .** xFree ar
373d0 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20  gument when the 
373e0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
373f0 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e  n was made is in
37400 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a  voked on the .**
37410 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74   blob of allocat
37420 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ed memory. This 
37430 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
37440 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  not call sqlite3
37450 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68  _free().** on th
37460 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74  e memory, the bt
37470 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74  ree layer does t
37480 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  hat..*/.void *sq
37490 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
374a0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
374b0 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72  Bytes, void(*xFr
374c0 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20  ee)(void *)){.  
374d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
374e0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
374f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
37500 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68    if( !pBt->pSch
37510 65 6d 61 20 26 26 20 6e 42 79 74 65 73 20 29 7b  ema && nBytes ){
37520 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65 6d  .    pBt->pSchem
37530 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  a = sqlite3Mallo
37540 63 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b 0a 20  cZero(nBytes);. 
37550 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
37560 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d  ema = xFree;.  }
37570 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37580 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
37590 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a  n pBt->pSchema;.
375a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
375b0 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20  true if another 
375c0 75 73 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65  user of the same
375d0 20 73 68 61 72 65 64 20 62 74 72 65 65 20 61 73   shared btree as
375e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   the argument.**
375f0 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e   handle holds an
37600 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
37610 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
37620 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ster table..*/.i
37630 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
37640 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65  chemaLocked(Btre
37650 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
37660 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37670 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
37680 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
37690 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
376a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 71  er(p);.  rc = (q
376b0 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
376c0 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
376d0 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45  AD_LOCK)!=SQLITE
376e0 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  _OK);.  sqlite3B
376f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
37700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23  return rc;.}...#
37710 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37720 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
37730 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c  /*.** Obtain a l
37740 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
37750 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65   whose root page
37760 20 69 73 20 69 54 61 62 2e 20 20 54 68 65 0a 2a   is iTab.  The.*
37770 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77 72 69 74  * lock is a writ
37780 65 20 6c 6f 63 6b 20 69 66 20 69 73 57 72 69 74  e lock if isWrit
37790 65 6c 6f 63 6b 20 69 73 20 74 72 75 65 20 6f 72  elock is true or
377a0 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20   a read lock.** 
377b0 69 66 20 69 74 20 69 73 20 66 61 6c 73 65 2e 0a  if it is false..
377c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
377d0 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72  reeLockTable(Btr
377e0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c  ee *p, int iTab,
377f0 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29   u8 isWriteLock)
37800 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
37810 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
37820 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
37830 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 52   u8 lockType = R
37840 45 41 44 5f 4c 4f 43 4b 20 2b 20 69 73 57 72 69  EAD_LOCK + isWri
37850 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 61 73 73 65  teLock;.    asse
37860 72 74 28 20 52 45 41 44 5f 4c 4f 43 4b 2b 31 3d  rt( READ_LOCK+1=
37870 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
37880 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72 69     assert( isWri
37890 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73 57  teLock==0 || isW
378a0 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  riteLock==1 );. 
378b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
378c0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
378d0 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
378e0 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
378f0 70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  pe);.    if( rc=
37900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37910 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62      rc = lockTab
37920 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b  le(p, iTab, lock
37930 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Type);.    }.   
37940 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
37950 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
37960 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
37970 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
37980 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
37990 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43  *.** Argument pC
379a0 73 72 20 6d 75 73 74 20 62 65 20 61 20 63 75 72  sr must be a cur
379b0 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  sor opened for w
379c0 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a  riting on an .**
379d0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75   INTKEY table cu
379e0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
379f0 20 61 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c   at a valid tabl
37a00 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69  e entry. .** Thi
37a10 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66  s function modif
37a20 69 65 73 20 74 68 65 20 64 61 74 61 20 73 74 6f  ies the data sto
37a30 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
37a40 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e  hat entry..** On
37a50 6c 79 20 74 68 65 20 64 61 74 61 20 63 6f 6e 74  ly the data cont
37a60 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ent may only be 
37a70 6d 6f 64 69 66 69 65 64 2c 20 69 74 20 69 73 20  modified, it is 
37a80 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20  not possible.** 
37a90 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 6c 65  to change the le
37aa0 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
37ab0 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20   stored..*/.int 
37ac0 73 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44  sqlite3BtreePutD
37ad0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
37ae0 73 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  sr, u32 offset, 
37af0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a  u32 amt, void *z
37b00 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
37b10 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
37b20 73 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sr) );.  assert(
37b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
37b40 65 6c 64 28 70 43 73 72 2d 3e 70 42 74 72 65 65  eld(pCsr->pBtree
37b50 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
37b60 20 20 61 73 73 65 72 74 28 70 43 73 72 2d 3e 69    assert(pCsr->i
37b70 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29  sIncrblobHandle)
37b80 3b 0a 0a 20 20 72 65 73 74 6f 72 65 43 75 72 73  ;..  restoreCurs
37b90 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 73 72 29  orPosition(pCsr)
37ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
37bb0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
37bc0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
37bd0 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61    if( pCsr->eSta
37be0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
37bf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
37c00 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
37c10 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d  ..  /* Check som
37c20 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  e preconditions:
37c30 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65   .  **   (a) the
37c40 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
37c50 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a  for writing,.  *
37c60 2a 20 20 20 28 62 29 20 74 68 65 72 65 20 69 73  *   (b) there is
37c70 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   no read-lock on
37c80 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
37c90 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 0a 20 20   modified and.  
37ca0 2a 2a 20 20 20 28 63 29 20 74 68 65 20 63 75 72  **   (c) the cur
37cb0 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  sor points at a 
37cc0 76 61 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e 20  valid row of an 
37cd0 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20  intKey table..  
37ce0 2a 2f 0a 20 20 69 66 28 20 21 70 43 73 72 2d 3e  */.  if( !pCsr->
37cf0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
37d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
37d10 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ONLY;.  }.  asse
37d20 72 74 28 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e  rt( !pCsr->pBt->
37d30 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20  readOnly .      
37d40 20 20 20 20 26 26 20 70 43 73 72 2d 3e 70 42 74      && pCsr->pBt
37d50 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
37d60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
37d70 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
37d80 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65  ocks(pCsr->pBtre
37d90 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCsr->pgnoRoo
37da0 74 2c 20 70 43 73 72 2c 20 30 29 20 29 7b 0a 20  t, pCsr, 0) ){. 
37db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37dc0 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
37dd0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
37de0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
37df0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  lock */.  }.  if
37e00 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCsr->eState==
37e10 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
37e20 7c 20 21 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e  | !pCsr->pPage->
37e30 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
37e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
37e50 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
37e60 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
37e70 43 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Csr, offset, amt
37e80 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
37e90 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a   *)z, 0, 1);.}..
37ea0 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  /* .** Set a fla
37eb0 67 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72  g on this cursor
37ec0 20 74 6f 20 63 61 63 68 65 20 74 68 65 20 6c 6f   to cache the lo
37ed0 63 61 74 69 6f 6e 73 20 6f 66 20 70 61 67 65 73  cations of pages
37ee0 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76   from the .** ov
37ef0 65 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20  erflow list for 
37f00 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
37f10 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
37f20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
37f30 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74  ** for increment
37f40 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e  al blob IO only.
37f50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
37f60 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67  tion sets a flag
37f70 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61   only. The actua
37f80 6c 20 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20  l page location 
37f90 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64  cache.** (stored
37fa0 20 69 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76   in BtCursor.aOv
37fb0 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c  erflow[]) is all
37fc0 6f 63 61 74 65 64 20 61 6e 64 20 75 73 65 64 20  ocated and used 
37fd0 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  by function.** a
37fe0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28  ccessPayload() (
37ff0 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74  the worker funct
38000 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42  ion for sqlite3B
38010 74 72 65 65 44 61 74 61 28 29 20 61 6e 64 0a 2a  treeData() and.*
38020 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 75  * sqlite3BtreePu
38030 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69  tData())..*/.voi
38040 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 61  d sqlite3BtreeCa
38050 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74 43 75  cheOverflow(BtCu
38060 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
38070 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
38080 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
38090 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
380a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
380b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
380c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
380d0 72 74 28 21 70 43 75 72 2d 3e 69 73 49 6e 63 72  rt(!pCur->isIncr
380e0 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61  blobHandle);.  a
380f0 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
38100 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
38110 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
38120 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  e = 1;.}.#endif.