/ Hex Artifact Content
Login

Artifact c7fc867f52fbe5fc729aa56ce0a48c2645def82e:


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 36 33 34 20 32 30 30 39 2f 30  c,v 1.634 2009/0
0190: 36 2f 31 37 20 31 33 3a 35 37 3a 31 36 20 64 72  6/17 13:57:16 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 31 3b 20 20 2f 2a 20 54 72  eTrace=1;  /* 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 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0450: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0460: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0470: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0480: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0490: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
04a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
04b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
04c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
04d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
04e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
04f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0500: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0510: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0520: 2a 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20  **.** Access to 
0530: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
0540: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 53 51   protected by SQ
0550: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0560: 43 5f 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66  C_MASTER..*/.#if
0570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0580: 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45  BtShared *SQLITE
0590: 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68 61 72  _WSD sqlite3Shar
05a0: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
05b0: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74  .#else.static Bt
05c0: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
05d0: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
05e0: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
05f0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
0600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0610: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0640: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0650: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0660: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0670: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0690: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
06a0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06c0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06d0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06e0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06f0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
0700: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0710: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0720: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0730: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0750: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0760: 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  ){.  sqlite3Glob
0770: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
0780: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e  acheEnabled = en
0790: 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  able;.  return S
07a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
07b0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  if.../*.** Forwa
07c0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
07d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
07e0: 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63  ckForReadConflic
07f0: 74 73 28 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c  ts(Btree*, Pgno,
0800: 20 42 74 43 75 72 73 6f 72 2a 2c 20 69 36 34 29   BtCursor*, i64)
0810: 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;...#ifdef SQLIT
0820: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0830: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0840: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0850: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
0860: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
0870: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0880: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
0890: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
08a0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
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 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0a20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0a30: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0a40: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0a50: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0a60: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0a70: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0a80: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0a90: 63 6b 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a 23  cks(a).#endif..#
0aa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0ab0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0ac0: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73  /*.** Query to s
0ad0: 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e 64  ee if btree hand
0ae0: 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20  le p may obtain 
0af0: 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65  a lock of type e
0b00: 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c  Lock .** (READ_L
0b10: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
0b20: 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  K) on the table 
0b30: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
0b40: 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53  Tab. Return.** S
0b50: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
0b60: 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61  lock may be obta
0b70: 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67  ined (by calling
0b80: 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61 63  .** setSharedCac
0b90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20  heTableLock()), 
0ba0: 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  or SQLITE_LOCKED
0bb0: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
0bc0: 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61 72  ic int queryShar
0bd0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0be0: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0bf0: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0c00: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0c10: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0c20: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0c30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0c40: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0c50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
0c60: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
0c70: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
0c80: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
0c90: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a   p->db!=0 );.  .
0ca0: 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69    /* If requesti
0cb0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c  ng a write-lock,
0cc0: 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65 20   then the Btree 
0cd0: 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65  must have an ope
0ce0: 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61  n write.  ** tra
0cf0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73  nsaction on this
0d00: 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69   file. And, obvi
0d10: 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20  ously, for this 
0d20: 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a  to be so there .
0d30: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20    ** must be an 
0d40: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
0d50: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69  action on the fi
0d60: 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  le itself..  */.
0d70: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
0d80: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70  =READ_LOCK || (p
0d90: 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26  ==pBt->pWriter &
0da0: 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
0db0: 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20  ANS_WRITE) );.  
0dc0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
0dd0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d  EAD_LOCK || pBt-
0de0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
0df0: 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
0e00: 20 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61   .  /* This is a
0e10: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
0e20: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
0e30: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
0e40: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
0e50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0e60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
0e70: 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72  /* If some other
0e80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
0e90: 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  olding an exclus
0ea0: 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20  ive lock, the.  
0eb0: 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  ** requested loc
0ec0: 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74  k may not be obt
0ed0: 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ained..  */.  if
0ee0: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d  ( pBt->pWriter!=
0ef0: 70 20 26 26 20 70 42 74 2d 3e 69 73 45 78 63 6c  p && pBt->isExcl
0f00: 75 73 69 76 65 20 29 7b 0a 20 20 20 20 73 71 6c  usive ){.    sql
0f10: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
0f20: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
0f30: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
0f40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0f50: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
0f60: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ACHE;.  }..  /* 
0f70: 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68  This (along with
0f80: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0f90: 61 62 6c 65 4c 6f 63 6b 28 29 29 20 69 73 20 77  ableLock()) is w
0fa0: 68 65 72 65 0a 20 20 2a 2a 20 74 68 65 20 52 65  here.  ** the Re
0fb0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0fc0: 61 67 20 69 73 20 64 65 61 6c 74 20 77 69 74 68  ag is dealt with
0fd0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
0fe0: 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67  ller is querying
0ff0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b   for a read-lock
1000: 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 0a 20 20   on any table.  
1010: 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
1020: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1030: 74 61 62 6c 65 20 28 74 61 62 6c 65 20 31 29 20  table (table 1) 
1040: 61 6e 64 20 69 66 20 74 68 65 20 52 65 61 64 55  and if the ReadU
1050: 6e 63 6f 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20  ncommitted.  ** 
1060: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
1070: 6e 20 74 68 65 20 6c 6f 63 6b 20 67 72 61 6e 74  n the lock grant
1080: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 72 65  ed even if there
1090: 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73   are write-locks
10a0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62  .  ** on the tab
10b0: 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c  le. If a write-l
10c0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
10d0: 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  , the ReadUncomm
10e0: 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20  itted flag.  ** 
10f0: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
1100: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  d..  **.  ** In 
1110: 66 75 6e 63 74 69 6f 6e 20 73 65 74 53 68 61 72  function setShar
1120: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1130: 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f  (), if a read-lo
1140: 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61  ck is demanded a
1150: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61  nd the .  ** Rea
1160: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1170: 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74  g is set, no ent
1180: 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ry is added to t
1190: 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20  he locks list . 
11a0: 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c   ** (BtShared.pL
11b0: 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ock)..  **.  ** 
11c0: 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66  To summarize: If
11d0: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
11e0: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
11f0: 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72 73  , then read curs
1200: 6f 72 73 0a 20 20 2a 2a 20 6f 6e 20 6e 6f 6e 2d  ors.  ** on non-
1210: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 64 6f  schema tables do
1220: 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72   not create or r
1230: 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63  espect table loc
1240: 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  ks. The locking.
1250: 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 66    ** procedure f
1260: 6f 72 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  or a write-curso
1270: 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  r does not chang
1280: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  e..  */.  if( . 
1290: 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c     0==(p->db->fl
12a0: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
12b0: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a  ncommitted) || .
12c0: 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45      eLock==WRITE
12d0: 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61  _LOCK ||.    iTa
12e0: 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  b==MASTER_ROOT. 
12f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
1300: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1310: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1320: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1330: 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
1340: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
1350: 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f  eLock) in the fo
1360: 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  llowing if(...) 
1370: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
1380: 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66  ent is a simplif
1390: 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20  ication of:.    
13a0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
13b0: 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  (eLock==WRITE_LO
13c0: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f  CK || pIter->eLo
13d0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a  ck==WRITE_LOCK).
13e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13f0: 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
1400: 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57  that if eLock==W
1410: 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20  RITE_LOCK, then 
1420: 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1430: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  ion.      ** may
1440: 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f   hold a WRITE_LO
1450: 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20  CK on any table 
1460: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69  in this file (si
1470: 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20  nce there can.  
1480: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
1490: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
14a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14b0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
14c0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
14d0: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
14e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
14f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f       assert( eLo
1500: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1510: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d   pIter->pBtree==
1520: 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63  p || pIter->eLoc
1530: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  k==READ_LOCK);. 
1540: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
1550: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
1560: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1570: 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   && pIter->eLock
1580: 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  !=eLock ){.     
1590: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
15a0: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
15b0: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
15c0: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  ->db);.        i
15d0: 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  f( eLock==WRITE_
15e0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
15f0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74    assert( p==pBt
1600: 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1610: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
1620: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
1630: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
1640: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1650: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1660: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1670: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1680: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1690: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
16a0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
16b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16c0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16d0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
16e0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
16f0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1700: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
1710: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
1720: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
1730: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
1740: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
1750: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
1760: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
1770: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1780: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1790: 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20  e lock is added 
17a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51  successfully. SQ
17b0: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
17c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61   SQLITE_NOMEM ma
17d0: 79 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e  y also be return
17e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
17f0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
1800: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
1810: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
1820: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1830: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1840: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
1850: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
1860: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
1870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1880: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
18a0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
18b0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
18c0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
18d0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
18e0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
18f0: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
1900: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
1910: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
1920: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
1930: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1940: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
1950: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
1960: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1970: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1980: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
1990: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d   /* If the read-
19a0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
19b0: 20 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65   is set and a re
19c0: 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ad-lock is reque
19d0: 73 74 65 64 20 6f 6e 0a 20 20 2a 2a 20 61 20 6e  sted on.  ** a n
19e0: 6f 6e 2d 73 63 68 65 6d 61 20 74 61 62 6c 65 2c  on-schema table,
19f0: 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
1a00: 73 20 61 6c 77 61 79 73 20 67 72 61 6e 74 65 64  s always granted
1a10: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 0a  .  Return early.
1a20: 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 61 64 64    ** without add
1a30: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
1a40: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
1a50: 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a  ck list. See.  *
1a60: 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e  * comment in fun
1a70: 63 74 69 6f 6e 20 71 75 65 72 79 53 68 61 72 65  ction queryShare
1a80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1a90: 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 0a  ) for more info.
1aa0: 20 20 2a 2a 20 6f 6e 20 68 61 6e 64 6c 69 6e 67    ** on handling
1ab0: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
1ac0: 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a  tted flag..  */.
1ad0: 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64    if( .    (p->d
1ae0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1af0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1b00: 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d   && .    (eLock=
1b10: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20  =READ_LOCK) &&. 
1b20: 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45     iTable!=MASTE
1b30: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1b40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
1b60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
1b70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
1b80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
1b90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
1ba0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1bb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1bc0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1bd0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
1be0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
1bf0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
1c00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
1c10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
1c20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1c30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
1c40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
1c50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
1c60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
1c70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
1c80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
1c90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
1ca0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
1cb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
1cc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1cd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
1ce0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
1cf0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
1d00: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
1d10: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
1d20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1d30: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
1d40: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
1d60: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
1d70: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
1d80: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
1d90: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
1da0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
1db0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
1dc0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
1dd0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
1de0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
1df0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
1e00: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
1e10: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
1e20: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
1e30: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
1e40: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
1e50: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
1e60: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
1e70: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
1e80: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1e90: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
1ea0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
1eb0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
1ec0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
1ed0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
1ee0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1ef0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1f00: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
1f10: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
1f20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f30: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1f40: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
1f50: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
1f60: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
1f70: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
1f80: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
1f90: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1fa0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
1fb0: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
1fc0: 65 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e p..**.** This 
1fd0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
1fe0: 20 74 68 61 74 20 68 61 6e 64 6c 65 20 70 20 68   that handle p h
1ff0: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
2000: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
2010: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
2020: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
2030: 68 65 20 42 74 53 68 61 72 65 64 2e 69 73 50 65  he BtShared.isPe
2040: 6e 64 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a  nding variable.*
2050: 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72 65  * may be incorre
2060: 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ctly cleared..*/
2070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
2080: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
2090: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
20a0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
20b0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
20c0: 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65    BtLock **ppIte
20d0: 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b  r = &pBt->pLock;
20e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20f0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2100: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2110: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  t( p->sharable |
2120: 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a  | 0==*ppIter );.
2130: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
2140: 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69  rans>0 );..  whi
2150: 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20  le( *ppIter ){. 
2160: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
2170: 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20   = *ppIter;.    
2180: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 45  assert( pBt->isE
2190: 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70  xclusive==0 || p
21a0: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f  Bt->pWriter==pLo
21b0: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
21c0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
21d0: 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73  >pBtree->inTrans
21e0: 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  >=pLock->eLock )
21f0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
2200: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
2210: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
2220: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
2230: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2240: 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Lock);.    }else
2250: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
2260: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
2270: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
2280: 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e 64  ert( pBt->isPend
2290: 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  ing==0 || pBt->p
22a0: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
22b0: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
22c0: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
22d0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
22e0: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
22f0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65  0;.    pBt->isPe
2300: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65 6c  nding = 0;.  }el
2310: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
2320: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
2330: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
2340: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
2350: 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  en connection p 
2360: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
2370: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
2380: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
2390: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
23a0: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
23b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
23c0: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
23d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
23e0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
23f0: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
2400: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
2410: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
2420: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
2430: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
2440: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
2450: 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67 20   isPending flag 
2460: 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  to 0..    **.   
2470: 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   ** If there is 
2480: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20  not currently a 
2490: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74 53  writer, then BtS
24a0: 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20  hared.isPending 
24b0: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a  must.    ** be z
24c0: 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20  ero already. So 
24d0: 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69  this next line i
24e0: 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68  s harmless in th
24f0: 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
2500: 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69      pBt->isPendi
2510: 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  ng = 0;.  }.}.#e
2520: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2530: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2540: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
2550: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
2560: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f  Page *pPage);  /
2570: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
2580: 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65  nce */../*.** Ve
2590: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
25a0: 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75 74  rsor holds a mut
25b0: 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
25c0: 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  ed.*/.#ifndef ND
25d0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
25e0: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
2600: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
2610: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
2620: 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  t->mutex);.}.#en
2630: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
2640: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
2650: 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  OB./*.** Invalid
2660: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
2670: 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
2680: 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72   for cursor pCur
2690: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61  , if any..*/.sta
26a0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
26b0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
26c0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
26e0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26f0: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
2700: 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
2710: 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61  flow);.  pCur->a
2720: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a  Overflow = 0;.}.
2730: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
2740: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
2750: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
2760: 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  or all cursors o
2770: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  pened.** on the 
2780: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
2790: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73  ucture pBt..*/.s
27a0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
27b0: 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
27c0: 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a  Cache(BtShared *
27d0: 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
27e0: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
27f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2800: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2810: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
2820: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2830: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c  Next){.    inval
2840: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
2850: 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  he(p);.  }.}.#el
2860: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  se.  #define inv
2870: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
2880: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
2890: 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  e invalidateAllO
28a0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
28b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
28c0: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
28d0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
28e0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
28f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
2900: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
2910: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
2920: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
2930: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
2940: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
2950: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
2960: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
2970: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
2980: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
2990: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
29a0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
29b0: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
29c0: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
29d0: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
29e0: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
29f0: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
2a00: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
2a10: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
2a20: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
2a30: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
2a40: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
2a50: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
2a60: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2a70: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
2a80: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
2a90: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
2aa0: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
2ab0: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
2ac0: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
2ad0: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
2ae0: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
2af0: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
2b00: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
2b10: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
2b20: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
2b30: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
2b40: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
2b50: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
2b60: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
2b70: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
2b80: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
2b90: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2ba0: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
2bb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
2bc0: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
2bd0: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
2be0: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
2bf0: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
2c00: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
2c10: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
2c20: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
2c30: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
2c40: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
2c50: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
2c60: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
2c70: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
2c80: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
2c90: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
2ca0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
2cb0: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
2cc0: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
2cd0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
2ce0: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
2cf0: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
2d00: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
2d10: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
2d20: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
2d30: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
2d40: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
2d50: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
2d60: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
2d70: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
2d80: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
2d90: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
2da0: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
2db0: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
2dc0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
2dd0: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
2de0: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
2df0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2e00: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
2e10: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
2e20: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
2e30: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
2e40: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
2e50: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
2e60: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
2e70: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
2e80: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
2e90: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2ea0: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
2eb0: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
2ec0: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
2ed0: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
2ee0: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
2ef0: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
2f00: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
2f10: 73 20 6f 6d 6d 69 74 74 65 64 20 69 66 20 74 68  s ommitted if th
2f20: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2f30: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
2f40: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
2f50: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
2f60: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2f70: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
2f80: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
2f90: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
2fa0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
2fb0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
2fc0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
2fd0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
2fe0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
2ff0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
3000: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
3010: 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ent ){.    int n
3020: 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Page;.    rc = s
3030: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
3040: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
3050: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
3060: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3070: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
3080: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
3090: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
30a0: 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20 20  ((u32)nPage);.  
30b0: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
30c0: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
30d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
30f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
3100: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
3110: 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69   pgno<=sqlite3Bi
3120: 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48  tvecSize(pBt->pH
3130: 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20  asContent) ){.  
3140: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
3150: 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61  tvecSet(pBt->pHa
3160: 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b  sContent, pgno);
3170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79  ;.}../*.** Query
3190: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
31a0: 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72  asContent vector
31b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
31c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31d0: 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  when a free-list
31e0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
31f0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  moved from the.*
3200: 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20  * free-list for 
3210: 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e  reuse. It return
3220: 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  s false if it is
3230: 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76   safe to retriev
3240: 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72  e the.** page fr
3250: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
3260: 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
3270: 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
3280: 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73  t. True otherwis
3290: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
32a0: 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74   btreeGetHasCont
32b0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
32c0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
32d0: 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74   Bitvec *p = pBt
32e0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20  ->pHasContent;. 
32f0: 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
3300: 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65  gno>sqlite3Bitve
3310: 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69  cSize(p) || sqli
3320: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c  te3BitvecTest(p,
3330: 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a   pgno)));.}../*.
3340: 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f  ** Clear (destro
3350: 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  y) the BtShared.
3360: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3370: 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ec. This should 
3380: 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74  be.** invoked at
3390: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
33a0: 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72  of each write-tr
33b0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
33c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43  atic void btreeC
33d0: 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42  learHasContent(B
33e0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
33f0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
3400: 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43  stroy(pBt->pHasC
3410: 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e  ontent);.  pBt->
3420: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b  pHasContent = 0;
3430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
3440: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
3450: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
3460: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
3470: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
3480: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
3490: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
34a0: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
34b0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
34c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34d0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
34e0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
34f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
3500: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
3510: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
3520: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
3530: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
3540: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
3550: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
3560: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
3570: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
3580: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
3590: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
35a0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
35b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
35c0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
35d0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
35e0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
35f0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
3600: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
3610: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
3620: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
3630: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
3640: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
3650: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
3660: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
3670: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
3680: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
3690: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
36a0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
36b0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
36c0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
36d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
36e0: 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
36f0: 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64  ntKey){.    void
3700: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
3710: 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75  Malloc( (int)pCu
3720: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
3730: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
3740: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3750: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
3760: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
3770: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
3780: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3790: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
37a0: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
37b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
37d0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
37e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
37f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
3800: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
3810: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50  sert( !pCur->apP
3820: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
3830: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
3840: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
3850: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
3860: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
3870: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
3880: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
3890: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
38a0: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
38b0: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
38c0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
38d0: 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
38e0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
38f0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
3900: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
3910: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3920: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
3930: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3940: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
3950: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
3960: 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45  ursors except pE
3970: 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68  xcept open on th
3980: 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68  e table .** with
3990: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
39a0: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
39b0: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
39c0: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
39d0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
39e0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
39f0: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
3a00: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
3a10: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
3a20: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
3a30: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
3a40: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
3a50: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
3a60: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3a70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3a80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3a90: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
3aa0: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
3ab0: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
3ac0: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
3ad0: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
3ae0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
3af0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
3b00: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
3b10: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
3b20: 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20  iRoot) && .     
3b30: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55     p->eState==CU
3b40: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
3b50: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
3b60: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
3b70: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  p);.      if( SQ
3b80: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
3b90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
3ba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3bb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
3bc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3bd0: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
3be0: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
3bf0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3c00: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
3c10: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
3c20: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
3c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
3c40: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
3c50: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
3c60: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
3c70: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
3c80: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
3c90: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
3ca0: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
3cb0: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
3cc0: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
3cd0: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
3ce0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
3cf0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
3d00: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
3d10: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
3d20: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
3d30: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
3d40: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
3d50: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
3d60: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
3d70: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
3d80: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
3d90: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
3da0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
3db0: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
3dc0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
3dd0: 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ion()..*/.int sq
3de0: 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72  lite3BtreeRestor
3df0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
3e00: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
3e10: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
3e20: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
3e30: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
3e40: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
3e50: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
3e60: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
3e70: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
3e80: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
3e90: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
3ea0: 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43  ->skip;.  }.  pC
3eb0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
3ec0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
3ed0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
3ee0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
3ef0: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
3f00: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
3f10: 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  kip);.  if( rc==
3f20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3f30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
3f40: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
3f50: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
3f60: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
3f70: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
3f80: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
3f90: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
3fa0: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
3fb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
3fc0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
3fd0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
3fe0: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
3ff0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
4000: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71   ? \.         sq
4010: 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72  lite3BtreeRestor
4020: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
4030: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
4040: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
4050: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
4060: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
4070: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
4080: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
4090: 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
40a0: 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f  laced at.  Curso
40b0: 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  rs can move when
40c0: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
40d0: 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74  e pointing.** at
40e0: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20   is deleted out 
40f0: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e  from under them.
4100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4110: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ine returns an e
4120: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d  rror code if som
4130: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4140: 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67  g.  The.** integ
4150: 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73  er *pHasMoved is
4160: 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74   set to one if t
4170: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  he cursor has mo
4180: 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74  ved and 0 if not
4190: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
41a0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
41b0: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
41c0: 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76  ur, int *pHasMov
41d0: 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ed){.  int rc;..
41e0: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
41f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
4200: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
4210: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
4220: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
4230: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
4240: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
4250: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
4260: 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20  >skip!=0 ){.    
4270: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a  *pHasMoved = 1;.
4280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48    }else{.    *pH
4290: 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d  asMoved = 0;.  }
42a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
42b0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
42c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
42d0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
42e0: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
42f0: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
4300: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
4310: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
4320: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
4330: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
4340: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
4350: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
4360: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
4370: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
4380: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
4390: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
43a0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
43b0: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
43c0: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
43d0: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
43e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
43f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4400: 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65  x) );.  nPagesPe
4410: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
4420: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
4430: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
4440: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
4450: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
4460: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
4470: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
4480: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
4490: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
44a0: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
44b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
44c0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
44d0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
44e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
44f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4500: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
4510: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
4520: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
4530: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
4540: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
4550: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
4560: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
4570: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e  er 'pgno'..** An
4580: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
4590: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
45a0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
45b0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
45c0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
45d0: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74  int ptrmapPut(Bt
45e0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
45f0: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
4600: 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20   Pgno parent){. 
4610: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
4620: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
4630: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
4640: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
4650: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
4660: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
4670: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
4680: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
4690: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
46a0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
46b0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
46c0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
46d0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
46e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
46f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4700: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
4710: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
4720: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
4730: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
4740: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
4750: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
4760: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
4770: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
4780: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
4790: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
47a0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
47b0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
47c0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
47d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
47e0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
47f0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
4800: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
4810: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
4820: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
4830: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
4840: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
4850: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4860: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
4870: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
4880: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
4890: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
48a0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
48b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
48c0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
48d0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
48e0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
48f0: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
4900: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
4910: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
4920: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
4930: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
4940: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
4950: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
4960: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
4970: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
4980: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
4990: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
49a0: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
49b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
49c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
49d0: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
49e0: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
49f0: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
4a00: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
4a10: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
4a20: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
4a30: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
4a40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4a50: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
4a60: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
4a70: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
4a80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
4a90: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
4aa0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
4ab0: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
4ac0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
4ad0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
4ae0: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
4af0: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
4b00: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
4b10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
4b20: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
4b30: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4b40: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
4b50: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
4b60: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
4b70: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4b80: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
4b90: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
4ba0: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
4bb0: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
4bc0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
4bd0: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
4be0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4bf0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
4c00: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
4c10: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
4c20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
4c30: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
4c40: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
4c50: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
4c60: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
4c70: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
4c80: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
4c90: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4ca0: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
4cb0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
4cc0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
4cd0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
4ce0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
4cf0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
4d00: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
4d10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
4d20: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
4d30: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
4d40: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
4d50: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
4d60: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
4d70: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
4d80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
4d90: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
4da0: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
4db0: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
4dc0: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
4dd0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
4de0: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
4df0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
4e00: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
4e10: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
4e20: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
4e30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
4e40: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
4e50: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
4e60: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
4e70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
4e80: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
4e90: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
4ea0: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
4eb0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
4ec0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
4ed0: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
4ee0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
4ef0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
4f00: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
4f10: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
4f20: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
4f30: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
4f40: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
4f50: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
4f60: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
4f70: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
4f80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4f90: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
4fa0: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
4fb0: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
4fc0: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
4fd0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
4fe0: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
4ff0: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
5000: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
5010: 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28  te(&(P)->aData[(
5020: 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  P)->cellOffset+2
5030: 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  *(I)])))../*.** 
5040: 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70  This a more comp
5050: 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  lex version of f
5060: 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77  indCell() that w
5070: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65  orks for.** page
5080: 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69  s that do contai
5090: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
50a0: 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f  .  See insert.*/
50b0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
50c0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
50d0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
50e0: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
50f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5100: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5110: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
5120: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
5130: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
5140: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
5150: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75   int k;.    stru
5160: 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f  ct _OvflCell *pO
5170: 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d  vfl;.    pOvfl =
5180: 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69   &pPage->aOvfl[i
5190: 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c  ];.    k = pOvfl
51a0: 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b  ->idx;.    if( k
51b0: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
51c0: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
51d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
51e0: 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20  pOvfl->pCell;.  
51f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
5200: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
5210: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
5220: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
5230: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
5240: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
5250: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
5260: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
5270: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
5280: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
5290: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
52a0: 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72  ion.  sqlite3Btr
52b0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
52c0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
52d0: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
52e0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
52f0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
5300: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
5310: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
5320: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
5330: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
5340: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
5350: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
5360: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
5370: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
5380: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
5390: 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  ad of.** sqlite3
53a0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
53b0: 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20  r(). Using some 
53c0: 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20  compilers, this 
53d0: 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a  will be faster..
53e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
53f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
5400: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
5410: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
5420: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
5430: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
5440: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
5450: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
5460: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
5470: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
5480: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
5490: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
54a0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
54b0: 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20   u16 n;         
54c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
54d0: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
54e0: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
54f0: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
5500: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
5510: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
5520: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
5530: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
5540: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5550: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
5560: 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ex) );..  pInfo-
5570: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
5580: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5590: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
55a0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
55b0: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
55c0: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
55d0: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
55e0: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
55f0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
5600: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
5610: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
5620: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
5630: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
5640: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  load);.    }else
5650: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
5660: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
5670: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
5680: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29  pCell[n], (u64*)
5690: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
56a0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
56b0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  = nPayload;.  }e
56c0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
56d0: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e  nData = 0;.    n
56e0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
56f0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
5700: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
5710: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
5720: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
5730: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
5740: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
5750: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20  ader = n;.  if( 
5760: 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c  likely(nPayload<
5770: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
5780: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  ) ){.    /* This
5790: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
57a0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
57b0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
57c0: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
57d0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
57e0: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
57f0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
5800: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a   */.    int nSiz
5810: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
5820: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c  otal size of cel
5830: 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74  l content in byt
5840: 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20  es */.    nSize 
5850: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a  = nPayload + n;.
5860: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5870: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
5880: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
5890: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
58a0: 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e 33   if( (nSize & ~3
58b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  )==0 ){.      nS
58c0: 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20  ize = 4;        
58d0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
58e0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20  size is 4 */.   
58f0: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53   }.    pInfo->nS
5900: 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a 65  ize = (u16)nSize
5910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
5920: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
5930: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
5940: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
5950: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
5960: 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65  ave.    ** to de
5970: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
5980: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
5990: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
59a0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a  pill onto.    **
59b0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
59c0: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
59d0: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
59e0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
59f0: 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  ed.    ** space 
5a00: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
5a10: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
5a20: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
5a30: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20  cal storage.    
5a40: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
5a50: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
5a60: 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cal..    **.    
5a70: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
5a80: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
5a90: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
5aa0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
5ab0: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20   any.    ** way 
5ac0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
5ad0: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
5ae0: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20  ile format..    
5af0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  */.    int minLo
5b00: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
5b10: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
5b20: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
5b30: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f  */.    int maxLo
5b40: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
5b50: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
5b60: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
5b70: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c  */.    int surpl
5b80: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
5b90: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
5ba0: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
5bb0: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69  orage */..    mi
5bc0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
5bd0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61  minLocal;.    ma
5be0: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
5bf0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75  maxLocal;.    su
5c00: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
5c10: 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
5c20: 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d  inLocal)%(pPage-
5c30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
5c40: 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73   - 4);.    if( s
5c50: 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63  urplus <= maxLoc
5c60: 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  al ){.      pInf
5c70: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
5c80: 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65  )surplus;.    }e
5c90: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  lse{.      pInfo
5ca0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
5cb0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
5cc0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
5cd0: 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e  flow = (u16)(pIn
5ce0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b  fo->nLocal + n);
5cf0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
5d00: 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72  e = pInfo->iOver
5d10: 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a  flow + 4;.  }.}.
5d20: 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c  #define parseCel
5d30: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
5d40: 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74  pInfo) \.  sqlit
5d50: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
5d60: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
5d70: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
5d80: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
5d90: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  ).void sqlite3Bt
5da0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
5db0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
5dc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
5dd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
5de0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
5df0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
5e00: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
5e10: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
5e20: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
5e30: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
5e40: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
5e50: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
5e60: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
5e70: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
5e80: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
5e90: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
5ea0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
5eb0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
5ec0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
5ed0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
5ee0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
5ef0: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
5f00: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
5f10: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
5f20: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
5f30: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
5f40: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
5f50: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
5f60: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
5f70: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
5f80: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
5f90: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
5fa0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
5fb0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
5fc0: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
5fd0: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
5fe0: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
5ff0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
6000: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
6010: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
6020: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
6030: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
6040: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
6050: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
6060: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
6070: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
6080: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
6090: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
60a0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
60b0: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
60c0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
60d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
60e0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
60f0: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
6100: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
6110: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
6120: 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42  info;.  sqlite3B
6130: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
6140: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
6150: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
6160: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
6170: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
6180: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
6190: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
61a0: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
61b0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
61c0: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
61d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
61e0: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
61f0: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
6200: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
6210: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
6220: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
6230: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
6240: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
6250: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
6260: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
6270: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
6280: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
6290: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
62a0: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
62b0: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
62c0: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
62d0: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
62e0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
62f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6300: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
6310: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
6320: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53  );.  }..  if( nS
6330: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
6340: 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  cal ){.    int m
6350: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
6360: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
6370: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
6380: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
6390: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
63a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
63b0: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69   4);.    if( nSi
63c0: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
63d0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
63e0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
63f0: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
6400: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
6410: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
6420: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
6430: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
6440: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
6450: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
6460: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
6470: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
6480: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
6490: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
64a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
64b0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64  6)nSize;.}.#ifnd
64c0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
64d0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
64e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
64f0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
6500: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
6510: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
6520: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
6530: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6540: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6550: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
6560: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
6570: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
6580: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
6590: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
65a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
65b0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
65c0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
65d0: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
65e0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
65f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
6600: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
6610: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
6620: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
6630: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65  nfo info;.  asse
6640: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
6650: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
6660: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
6670: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
6680: 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f  .  assert( (info
6690: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
66a0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
66b0: 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  y))==info.nPaylo
66c0: 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  ad );.  if( info
66d0: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
66e0: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
66f0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
6700: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
6710: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
6720: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
6730: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
6740: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
6750: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
6760: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6770: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
6780: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
6790: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
67a0: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
67b0: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
67c0: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
67d0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
67e0: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
67f0: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
6800: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
6810: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
6820: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
6830: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
6840: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
6850: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
6860: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
6870: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
6880: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68a0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
68b0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
68e0: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
68f0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6910: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
6920: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
6930: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
6940: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6960: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
6970: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
6980: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
6990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
69a0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
69b0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
69c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
69d0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
69e0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
69f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
6a00: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
6a10: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
6a20: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
6a30: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
6a40: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
6a50: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6a60: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6a70: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
6a80: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
6a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6aa0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
6ab0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
6ac0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
6ad0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
6ae0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
6af0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
6b00: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
6b10: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
6b20: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
6b30: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
6b40: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
6b50: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
6b60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6b70: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
6b80: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
6b90: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
6ba0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
6bb0: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
6bc0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
6bd0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
6be0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6bf0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
6c00: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
6c10: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
6c20: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
6c30: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
6c40: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
6c50: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
6c60: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
6c70: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
6c80: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
6c90: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
6ca0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
6cb0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
6cc0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
6cd0: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
6ce0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
6cf0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62  usableSize;.  cb
6d00: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
6d10: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
6d20: 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b  emcpy(&temp[cbrk
6d30: 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
6d40: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72  usableSize - cbr
6d50: 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  k);.  cbrk = usa
6d60: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
6d70: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
6d80: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
6d90: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
6da0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
6db0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
6dc0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
6dd0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
6de0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
6df0: 0a 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61  .    if( pc>=usa
6e00: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
6e10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6e20: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6e30: 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65   }.    size = ce
6e40: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
6e50: 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20   &temp[pc]);.   
6e60: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
6e70: 20 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c     if( cbrk<cell
6e80: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c  Offset+2*nCell |
6e90: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
6ea0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
6eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6ec0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
6ed0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
6ee0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
6ef0: 65 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a  e && cbrk>=0 );.
6f00: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
6f10: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
6f20: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
6f30: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
6f40: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
6f50: 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66  t( cbrk>=cellOff
6f60: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20  set+2*nCell );. 
6f70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6f80: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
6f90: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
6fa0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
6fb0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
6fc0: 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d  7] = 0;.  addr =
6fd0: 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43   cellOffset+2*nC
6fe0: 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ell;.  memset(&d
6ff0: 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62  ata[addr], 0, cb
7000: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65  rk-addr);.  asse
7010: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7020: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
7030: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
7040: 20 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d   if( cbrk-addr!=
7050: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
7060: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7070: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7080: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7090: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
70a0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
70b0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
70c0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
70d0: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
70e0: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
70f0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
7100: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
7110: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
7120: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   of the .** firs
7130: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
7140: 74 65 64 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a  ted space. .**.*
7150: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
7160: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
7170: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74   space between t
7180: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 65  he end of the ce
7190: 6c 6c 2d 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72  ll-offset .** ar
71a0: 72 61 79 20 61 6e 64 20 74 68 65 20 73 74 61 72  ray and the star
71b0: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
71c0: 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 61 74  ntent area is at
71d0: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
71e0: 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53  es.** in size. S
71f0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  o this routine c
7200: 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a  an never fail..*
7210: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
7220: 65 20 61 6c 72 65 61 64 79 20 36 30 20 6f 72 20  e already 60 or 
7230: 6d 6f 72 65 20 62 79 74 65 73 20 6f 66 20 66 72  more bytes of fr
7240: 61 67 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  agments within t
7250: 68 65 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20  he page,.** the 
7260: 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65  page is defragme
7270: 6e 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  nted before retu
7280: 72 6e 69 6e 67 2e 20 49 66 20 74 68 69 73 20 77  rning. If this w
7290: 65 72 65 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65  ere not done the
72a0: 72 65 0a 2a 2a 20 69 73 20 61 20 63 68 61 6e 63  re.** is a chanc
72b0: 65 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  e that the numbe
72c0: 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  r of fragmented 
72d0: 62 79 74 65 73 20 63 6f 75 6c 64 20 65 76 65 6e  bytes could even
72e0: 74 75 61 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66  tually .** overf
72f0: 6c 6f 77 20 74 68 65 20 73 69 6e 67 6c 65 2d 62  low the single-b
7300: 79 74 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  yte field of the
7310: 20 70 61 67 65 2d 68 65 61 64 65 72 20 69 6e 20   page-header in 
7320: 77 68 69 63 68 20 74 68 69 73 20 76 61 6c 75 65  which this value
7330: 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a  .** is stored..*
7340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
7350: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
7360: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
7370: 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69  Byte){.  const i
7380: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
7390: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
73a0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
73b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
73c0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
73d0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
73e0: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
73f0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
7400: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
7410: 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20  nt nFrag;       
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7440: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
7450: 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  s on pPage */.  
7460: 69 6e 74 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73  int top;.  .  as
7470: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7480: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
7490: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
74a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
74b0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
74c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
74d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
74e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
74f0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
7500: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
7510: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
7520: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7530: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
7540: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7550: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
7560: 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
7570: 68 61 74 20 74 68 65 20 73 70 61 63 65 20 62 65  hat the space be
7580: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f  tween the cell-o
7590: 66 66 73 65 74 20 61 72 72 61 79 20 61 6e 64 20  ffset array and 
75a0: 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63  the .  ** cell-c
75b0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 67  ontent area is g
75c0: 72 65 61 74 65 72 20 74 68 61 6e 20 6e 42 79 74  reater than nByt
75d0: 65 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20  e bytes..  */.  
75e0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 3d  assert( nByte <=
75f0: 20 28 0a 20 20 20 20 20 20 67 65 74 32 62 79 74   (.      get2byt
7600: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d  e(&data[hdr+5])-
7610: 28 68 64 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c  (hdr+8+(pPage->l
7620: 65 61 66 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62  eaf?0:4)+2*get2b
7630: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
7640: 29 29 0a 20 20 29 29 3b 0a 0a 20 20 70 50 61 67  )).  ));..  pPag
7650: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
7660: 29 6e 42 79 74 65 3b 0a 20 20 6e 46 72 61 67 20  )nByte;.  nFrag 
7670: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
7680: 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29   if( nFrag>=60 )
7690: 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65 6e 74  {.    defragment
76a0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
76b0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61  else{.    /* Sea
76c0: 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  rch the freelist
76d0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
76e0: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
76f0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 0a  ugh to satisfy .
7700: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
7710: 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69  st. The allocati
7720: 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d 20  on is made from 
7730: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 73  the first free s
7740: 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  lot in .    ** t
7750: 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
7760: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
7770: 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20  accomadate it.. 
7780: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63     */.    int pc
7790: 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72 28  , addr;.    for(
77a0: 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20  addr=hdr+1; (pc 
77b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
77c0: 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64 72  [addr]))>0; addr
77d0: 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =pc){.      int 
77e0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
77f0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20  &data[pc+2]);   
7800: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 72 65    /* Size of fre
7810: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
7820: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
7830: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
7840: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
7850: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 34  .        if( x<4
7860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
7870: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
7880: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
7890: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
78a0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
78b0: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
78c0: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
78d0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
78e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
78f0: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
7900: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
7910: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
7920: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
7930: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7940: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
7950: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
7960: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
7970: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
7980: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
7990: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
79a0: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
79b0: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
79c0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
79d0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
79e0: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
79f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
7a00: 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20  turn pc + x;.   
7a10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7a20: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
7a30: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
7a40: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
7a50: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
7a60: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
7a70: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
7a80: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
7a90: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7aa0: 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79 74 65 3b  hdr+5]) - nByte;
7ab0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7ac0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
7ad0: 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a    return top;.}.
7ae0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7af0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
7b00: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
7b10: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
7b20: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
7b30: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
7b40: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
7b50: 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61  Disk[start].** a
7b60: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
7b70: 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a  he block is "siz
7b80: 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  e" bytes..**.** 
7b90: 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f  Most of the effo
7ba0: 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c  rt here is invol
7bb0: 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67  ved in coalesing
7bc0: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65   adjacent.** fre
7bd0: 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20  e blocks into a 
7be0: 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20  single big free 
7bf0: 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  block..*/.static
7c00: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
7c10: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
7c20: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
7c30: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
7c40: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
7c50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
7c60: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
7c70: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
7c80: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
7c90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7ca0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
7cb0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
7cc0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
7cd0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
7ce0: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
7cf0: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
7d00: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
7d10: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
7d20: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
7d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7d40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7d50: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
7d60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
7d70: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
7d80: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
7d90: 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66   is 4 */..#ifdef
7da0: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
7db0: 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77  ELETE.  /* Overw
7dc0: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
7dd0: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
7de0: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43  ros when the SEC
7df0: 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a  URE_DELETE .  **
7e00: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
7e10: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
7e20: 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  me */.  memset(&
7e30: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
7e40: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  size);.#endif.. 
7e50: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
7e60: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
7e70: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
7e80: 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68  reeblocks */.  h
7e90: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
7ea0: 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20  ffset;.  addr = 
7eb0: 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  hdr + 1;.  while
7ec0: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
7ed0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
7ee0: 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67  ))<start && pbeg
7ef0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  in>0 ){.    asse
7f00: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
7f10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
7f20: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  ze-4 );.    if( 
7f30: 70 62 65 67 69 6e 3c 3d 61 64 64 72 20 29 20 7b  pbegin<=addr ) {
7f40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7f50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7f60: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  T;.    }.    add
7f70: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
7f80: 20 20 69 66 20 28 20 70 62 65 67 69 6e 3e 70 50    if ( pbegin>pP
7f90: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
7fa0: 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20 20 20 72  Size-4 ) {.    r
7fb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7fc0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
7fd0: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
7fe0: 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d  addr || pbegin==
7ff0: 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  0 );.  put2byte(
8000: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61  &data[addr], sta
8010: 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  rt);.  put2byte(
8020: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62  &data[start], pb
8030: 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74  egin);.  put2byt
8040: 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d  e(&data[start+2]
8050: 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  , size);.  pPage
8060: 2d 3e 6e 46 72 65 65 20 2b 3d 20 28 75 31 36 29  ->nFree += (u16)
8070: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
8080: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
8090: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
80a0: 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  ddr = pPage->hdr
80b0: 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68  Offset + 1;.  wh
80c0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
80d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
80e0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
80f0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
8100: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
8110: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
8120: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
8130: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
8140: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
8150: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
8160: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
8170: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
8180: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
8190: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
81a0: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
81b0: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
81c0: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
81d0: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
81e0: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
81f0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
8200: 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61  (frag<0) || (fra
8210: 67 3e 28 69 6e 74 29 64 61 74 61 5b 70 50 61 67  g>(int)data[pPag
8220: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 29  e->hdrOffset+7])
8230: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8240: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8250: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
8260: 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65        data[pPage
8270: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d  ->hdrOffset+7] -
8280: 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20  = (u8)frag;.    
8290: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
82a0: 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20  data[pnext]);.  
82b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
82c0: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a  ta[pbegin], x);.
82d0: 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20        x = pnext 
82e0: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
82f0: 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65  [pnext+2]) - pbe
8300: 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62  gin;.      put2b
8310: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
8320: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c  +2], x);.    }el
8330: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
8340: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
8350: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
8360: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
8370: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
8380: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
8390: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
83a0: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
83b0: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
83c0: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
83d0: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
83e0: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
83f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8400: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
8410: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
8420: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
8430: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
8440: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
8450: 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65  r+5]) + get2byte
8460: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
8470: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
8480: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
8490: 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  p);.  }.  assert
84a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
84b0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
84c0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
84d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
84e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
84f0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
8500: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
8510: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
8520: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
8530: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
8540: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
8550: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
8560: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
8570: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
8580: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
8590: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
85a0: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
85b0: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
85c0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
85d0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
85e0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
85f0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
8600: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
8610: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
8620: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
8630: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
8640: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
8650: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
8660: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
8670: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
8680: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
8690: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
86a0: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
86b0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
86c0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
86d0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
86e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
86f0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
8700: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
8710: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8720: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8730: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8740: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
8750: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
8760: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
8770: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
8780: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
8790: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
87a0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
87b0: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
87c0: 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  eaf;.  pBt = pPa
87d0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
87e0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
87f0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
8800: 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67  KEY) ){.    pPag
8810: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
8820: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
8830: 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b  a = pPage->leaf;
8840: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
8850: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
8860: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
8870: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
8880: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
8890: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
88a0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
88b0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
88c0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
88d0: 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20  >hasData = 0;.  
88e0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
88f0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
8900: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
8910: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
8920: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
8930: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8940: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8950: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8960: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8970: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
8980: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
8990: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
89a0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
89b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
89c0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
89d0: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
89e0: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
89f0: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
8a00: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
8a10: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
8a20: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
8a30: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
8a40: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
8a50: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
8a60: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
8a70: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
8a80: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
8a90: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
8aa0: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
8ab0: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
8ac0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
8ad0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
8ae0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8af0: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
8b00: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
8b10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8b20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8b30: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8b50: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
8b60: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
8b70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8b80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8b90: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
8ba0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
8bb0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
8bc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
8bd0: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
8be0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
8bf0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
8c00: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
8c10: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
8c20: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
8c30: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
8c40: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
8c50: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
8c60: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
8c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8c80: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
8c90: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
8ca0: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
8cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
8cc0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
8cd0: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
8ce0: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
8cf0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
8d00: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
8d10: 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a 65    u16 usableSize
8d20: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
8d30: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
8d40: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
8d50: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
8d60: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
8d70: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
8d80: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
8d90: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8da0: 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20 20  u16 nFree;      
8db0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8dc0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
8dd0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
8de0: 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20 20  u16 top;        
8df0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
8e00: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
8e10: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20  tent area */..  
8e20: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
8e30: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
8e40: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
8e50: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
8e60: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
8e70: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
8e80: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
8e90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8ea0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8eb0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
8ec0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
8ed0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33  pBt->pageSize<=3
8ee0: 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67  2768 );.    pPag
8ef0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
8f00: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
8f10: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
8f20: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
8f30: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
8f40: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
8f50: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
8f60: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
8f70: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
8f80: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
8f90: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
8fa0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
8fb0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
8fc0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8fd0: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
8fe0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
8ff0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
9000: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
9010: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
9020: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
9030: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
9040: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
9050: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9060: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
9070: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
9080: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
9090: 69 67 68 74 20 63 61 75 73 65 20 75 73 65 20 74  ight cause use t
90a0: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
90b0: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
90c0: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
90d0: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
90e0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
90f0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
9100: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
9110: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
9120: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
9130: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
9140: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
9150: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
9160: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
9170: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
9180: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
9190: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
91a0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
91b0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
91c0: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
91d0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
91e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
91f0: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
9200: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 65  */.      int iCe
9210: 6c 6c 4c 61 73 74 3b 20 20 20 20 2f 2a 20 4c 61  llLast;    /* La
9220: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
9230: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
9240: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9250: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
9260: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9270: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
9280: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
9290: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
92a0: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 43  ell */..      iC
92b0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
92c0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
92d0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 69 43  >nCell;.      iC
92e0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
92f0: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 20 20  Size - 4;.      
9300: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
9310: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
9320: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9330: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
9340: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
9350: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9360: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
9370: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
9380: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
9390: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
93a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
93b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
93c0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
93d0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
93e0: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
93f0: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
9400: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
9410: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
9420: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9430: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9440: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9450: 20 20 7d 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64    }.    }  .#end
9460: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  if..    /* Compu
9470: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
9480: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
9490: 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20  age */.    pc = 
94a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
94b0: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65  dr+1]);.    nFre
94c0: 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
94d0: 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65  + top;.    while
94e0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
94f0: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
9500: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
9510: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
9520: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
9530: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
9540: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
9550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9560: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
9570: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
9580: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9590: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
95a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
95b0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
95c0: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
95d0: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
95e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
95f0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
9600: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
9610: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
9620: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9630: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
9640: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
9650: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
9660: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
9670: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
9680: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
9690: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
96a0: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
96b0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
96c0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
96d0: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
96e0: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
96f0: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
9700: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
9710: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
9720: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
9730: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
9740: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
9750: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
9760: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
9770: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
9780: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
9790: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
97a0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
97b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
97c0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
97d0: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
97e0: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
97f0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
9800: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
9810: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
9820: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
9830: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9840: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9850: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
9860: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
9870: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2d 20 28  Free = nFree - (
9880: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
9890: 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 23  Page->nCell);..#
98a0: 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20  if 0.  /* Check 
98b0: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66  that all the off
98c0: 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  sets in the cell
98d0: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72   offset array ar
98e0: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
98f0: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74  .  ** .  ** Omit
9900: 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73  ting this consis
9910: 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20  tency check and 
9920: 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d  using the pPage-
9930: 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20  >maskPage mask. 
9940: 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f   ** to prevent o
9950: 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70  verrunning the p
9960: 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69  age buffer in fi
9970: 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73  ndCell() results
9980: 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20   in a.  ** 2.5% 
9990: 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e  performance gain
99a0: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
99b0: 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20  8 *pOff;        
99c0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
99d0: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
99e0: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
99f0: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75  n range */.    u
9a00: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
9a10: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
9a20: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
9a30: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38   array */.    u8
9a40: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f   mask;         /
9a50: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
9a60: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
9a70: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
9a80: 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d  offsets */.    m
9a90: 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42  ask = ~(((u8)(pB
9aa0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29  t->pageSize>>8))
9ab0: 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20  -1);.    pEnd = 
9ac0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9ad0: 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a   + pPage->nCell*
9ae0: 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66  2];.    for(pOff
9af0: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
9b00: 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26  t]; pOff!=pEnd &
9b10: 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b  & !((*pOff)&mask
9b20: 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20  ); pOff+=2);.   
9b30: 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20   if( pOff!=pEnd 
9b40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9b50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9b60: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
9b70: 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61 67 65  endif..    pPage
9b80: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
9b90: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9ba0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
9bb0: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
9bc0: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
9bd0: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
9be0: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
9bf0: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
9c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
9c10: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
9c20: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
9c30: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
9c40: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
9c50: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
9c60: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
9c70: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
9c80: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9c90: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
9ca0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9cb0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
9cc0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
9cd0: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
9ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9cf0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
9d00: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9d10: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
9d20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9d30: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
9d40: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
9d50: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
9d60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9d70: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
9d80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
9d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9da0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9db0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9dc0: 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68  /*memset(&data[h
9dd0: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
9de0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a  bleSize - hdr);*
9df0: 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  /.  data[hdr] = 
9e00: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
9e10: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
9e20: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
9e30: 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20  EAF)==0 ?1:0);. 
9e40: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
9e50: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
9e60: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
9e70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
9e80: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
9e90: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
9ea0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
9eb0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
9ec0: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
9ed0: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
9ee0: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
9ef0: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
9f00: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
9f10: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
9f20: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
9f30: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
9f40: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
9f50: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
9f60: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
9f70: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
9f80: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
9f90: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
9fa0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
9fb0: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
9fc0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
9fd0: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
9fe0: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
9ff0: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
a000: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
a010: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
a020: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
a030: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
a040: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
a050: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
a060: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
a070: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
a080: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
a090: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
a0a0: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
a0b0: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
a0c0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
a0d0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
a0e0: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
a0f0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
a100: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
a110: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
a120: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
a130: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
a140: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
a150: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
a160: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
a170: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
a180: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
a190: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
a1a0: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
a1b0: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
a1c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
a1d0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
a1e0: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
a1f0: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
a200: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
a210: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
a220: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
a230: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
a240: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
a250: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
a260: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
a270: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
a280: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
a290: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
a2a0: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
a2b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
a2c0: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
a2d0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
a2e0: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
a2f0: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
a300: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
a310: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
a320: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
a330: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
a340: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
a350: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
a360: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
a370: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
a380: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
a390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a3a0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
a3b0: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
a3c0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
a3d0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a3e0: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
a3f0: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
a400: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
a410: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
a420: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
a430: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
a440: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
a450: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
a460: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a470: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
a480: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
a490: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
a4a0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
a4b0: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
a4c0: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
a4d0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
a4e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
a4f0: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
a500: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
a510: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
a520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a530: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
a540: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
a550: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
a560: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
a570: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
a580: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
a590: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
a5a0: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
a5b0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
a5c0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
a5d0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
a5e0: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
a5f0: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
a600: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
a610: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
a620: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
a630: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
a640: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a650: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
a660: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
a670: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
a680: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
a690: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
a6a0: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
a6b0: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
a6c0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
a6d0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
a6e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a6f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
a700: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
a710: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a720: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
a730: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
a740: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
a750: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
a760: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
a770: 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65  c Pgno pagerPage
a780: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
a790: 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  pBt){.  int nPag
a7a0: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  e = -1;.  int rc
a7b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
a7c0: 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20  >pPage1 );.  rc 
a7d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
a7e0: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
a7f0: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
a800: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
a810: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d  TE_OK || nPage==
a820: 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  -1 );.  return (
a830: 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  Pgno)nPage;.}../
a840: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
a850: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
a860: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
a870: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
a880: 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  ** is just a con
a890: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
a8a0: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
a8b0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
a8c0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
a8d0: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  () and sqlite3Bt
a8e0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
a8f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
a900: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
a910: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
a920: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
a930: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
a940: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
a950: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a960: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
a970: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
a980: 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20  **ppPage     /* 
a990: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
a9a0: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29  ointer here */.)
a9b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
a9c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
a9d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a9e0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
a9f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
aa00: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
aa10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
aa20: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
aa30: 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74  ..  /* It is oft
aa40: 65 6e 20 74 68 65 20 63 61 73 65 20 74 68 61 74  en the case that
aa50: 20 74 68 65 20 70 61 67 65 20 77 65 20 77 61 6e   the page we wan
aa60: 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
aa70: 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73  cache..  ** If s
aa80: 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65 63 74  o, get it direct
aa90: 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65 73 20  ly.  This saves 
aaa0: 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74  us from having t
aab0: 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65  o call.  ** page
aac0: 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20  rPagecount() to 
aad0: 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69  make sure pgno i
aae0: 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c  s within limits,
aaf0: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20   which results. 
ab00: 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65   ** in a measure
ab10: 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  able performance
ab20: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20   improvements.. 
ab30: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   */.  *ppPage = 
ab40: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
ab50: 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e  eLookup(pBt, pgn
ab60: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 20  o);.  if( pPage 
ab70: 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69  ){.    /* Page i
ab80: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
ab90: 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  he */.    rc = S
aba0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
abb0: 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  e{.    /* Page n
abc0: 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20 41 63  ot in cache.  Ac
abd0: 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20  quire it. */.   
abe0: 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50   if( pgno>pagerP
abf0: 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
ac00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ac10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
ac20: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  T; .    }.    rc
ac30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
ac40: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
ac50: 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
ac60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
ac70: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20  n rc;.    pPage 
ac80: 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20  = *ppPage;.  }. 
ac90: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
aca0: 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nit ){.    rc = 
acb0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
acc0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
acd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ace0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
acf0: 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
ad00: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
ad10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ad20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
ad30: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
ad40: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
ad50: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
ad60: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
ad70: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
ad80: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
ad90: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
ada0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
adb0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
adc0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
add0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
ade0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
adf0: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
ae00: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3e  pPage->pDbPage)>
ae10: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
ae20: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
ae30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ae40: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
ae50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ae60: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ae70: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
ae80: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
ae90: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
aea0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
aeb0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
aec0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
aed0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
aee0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
aef0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
af00: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
af10: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
af20: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
af30: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
af40: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
af50: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
af60: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
af70: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
af80: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
af90: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
afa0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
afb0: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
afc0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
afd0: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
afe0: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
aff0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b000: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
b010: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
b020: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
b030: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
b040: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
b050: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
b060: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
b070: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
b080: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
b090: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
b0a0: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
b0b0: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
b0c0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
b0d0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
b0e0: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
b0f0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b100: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
b110: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
b120: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
b130: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
b140: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b150: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b160: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
b170: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
b180: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
b190: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
b1a0: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
b1b0: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
b1c0: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
b1d0: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
b1e0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
b1f0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
b200: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
b210: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
b220: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
b230: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
b240: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b250: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
b260: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
b270: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b280: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
b290: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
b2a0: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
b2b0: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
b2c0: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
b2d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
b2e0: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
b2f0: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
b300: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
b310: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
b320: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
b330: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
b340: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
b350: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
b360: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
b370: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
b380: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
b390: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
b3a0: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
b3b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
b3c0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
b3d0: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
b3e0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b3f0: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
b400: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
b410: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
b420: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b430: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
b440: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
b450: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
b460: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
b470: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
b480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
b490: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
b4a0: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
b4b0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
b4c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b4d0: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
b4e0: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e  e is NULL.** a n
b4f0: 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ew database with
b500: 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69   a random name i
b510: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73  s created.  This
b520: 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a   randomly named.
b530: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
b540: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
b550: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
b560: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
b570: 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  led..** If zFile
b580: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
b590: 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
b5a0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
b5b0: 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
b5c0: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
b5d0: 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
b5e0: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
b5f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
b600: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
b610: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
b620: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
b630: 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
b640: 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
b650: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
b660: 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
b670: 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
b680: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
b690: 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
b6a0: 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
b6b0: 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
b6c0: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
b6d0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
b6e0: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
b6f0: 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
b700: 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
b710: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
b720: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
b730: 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  eOpen(.  const c
b740: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
b750: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
b760: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
b770: 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
b780: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
b790: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
b7a0: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
b7b0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
b7c0: 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
b7d0: 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
b7e0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
b7f0: 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
b800: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
b810: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
b820: 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
b830: 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b850: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
b860: 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
b870: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
b880: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
b890: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  pVfs;           
b8a0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20    /* The VFS to 
b8b0: 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72  use for this btr
b8c0: 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ee */.  BtShared
b8d0: 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
b8e0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
b8f0: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
b900: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
b910: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b930: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
b940: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
b950: 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
b960: 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
b970: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
b980: 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
b990: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
b9a0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
b9b0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
b9c0: 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
b9d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
b9e0: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
b9f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
ba00: 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
ba10: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
ba20: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
ba30: 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
ba40: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
ba50: 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
ba60: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
ba70: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
ba80: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
ba90: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
baa0: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
bab0: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
bac0: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
bad0: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
bae0: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
baf0: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
bb00: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
bb10: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
bb20: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
bb30: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
bb40: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
bb50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bb60: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
bb70: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
bb80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
bb90: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
bba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
bbb0: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
bbc0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
bbd0: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
bbe0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
bbf0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
bc00: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
bc10: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
bc20: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
bc30: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
bc40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bc50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
bc60: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
bc70: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
bc80: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
bc90: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
bca0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
bcb0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
bcc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bcd0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
bce0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
bcf0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20  ->db = db;..#if 
bd00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bd10: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
bd20: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
bd30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
bd40: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
bd50: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
bd60: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
bd70: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
bd80: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
bd90: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
bda0: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
bdb0: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
bdc0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
bdd0: 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61  db==0 && zFilena
bde0: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
bdf0: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  0] ){.    if( sq
be00: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
be10: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
be20: 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  bled ){.      in
be30: 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
be40: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
be50: 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
be60: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
be70: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
be80: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
be90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
bea0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
beb0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ;.      p->shara
bec0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  ble = 1;.      d
bed0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
bee0: 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a  TE_SharedCache;.
bef0: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
bf00: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
bf10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bf20: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
bf30: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
bf40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bf50: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
bf60: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
bf70: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
bf80: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
bf90: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
bfa0: 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
bfb0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
bfc0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
bfd0: 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
bfe0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
bff0: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
c000: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
c010: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
c020: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
c030: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
c040: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
c050: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
c060: 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  red);.      for(
c070: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
c080: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
c090: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
c0a0: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
c0b0: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
c0c0: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
c0d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
c0e0: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
c0f0: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
c100: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
c110: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
c120: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
c130: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
c140: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
c150: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
c160: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
c170: 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
c180: 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
c190: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
c1a0: 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
c1b0: 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
c1c0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
c1d0: 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
c1e0: 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
c1f0: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
c200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c210: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
c220: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
c230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c240: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
c250: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
c260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c270: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
c280: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
c290: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c2a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c2b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c2c0: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
c2d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c2e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
c2f0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
c300: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
c310: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
c320: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
c330: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c340: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
c350: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
c360: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c370: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
c380: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
c390: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
c3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
c3b0: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
c3c0: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
c3d0: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
c3e0: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
c3f0: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
c400: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
c410: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
c420: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
c430: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
c440: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
c450: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
c460: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
c470: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
c480: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
c490: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
c4a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
c4b0: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
c4c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c4d0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
c4e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
c4f0: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
c500: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
c510: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
c520: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
c530: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
c540: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
c550: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
c560: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
c570: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
c580: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
c590: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
c5a0: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
c5b0: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
c5c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
c5d0: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
c5e0: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
c5f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
c600: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
c610: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
c620: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
c630: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
c640: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
c650: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
c660: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
c670: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
c680: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
c690: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
c6a0: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
c6b0: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
c6c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
c6d0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
c6e0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
c6f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
c700: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
c710: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
c720: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
c750: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
c760: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
c770: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c780: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c790: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
c7a0: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
c7b0: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
c7c0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
c7d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
c7e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c7f0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
c800: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
c810: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
c820: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
c830: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
c840: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
c850: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
c860: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
c870: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
c880: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
c890: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
c8a0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
c8b0: 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d  einit);.    pBt-
c8c0: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
c8d0: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
c8e0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
c8f0: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
c900: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
c910: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
c920: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
c930: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
c940: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
c950: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
c960: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
c970: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
c980: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
c990: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
c9a0: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
c9b0: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
c9c0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c9d0: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
c9e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
c9f0: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
ca00: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
ca10: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
ca20: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
ca30: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
ca40: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
ca50: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
ca60: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
ca70: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
ca80: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
ca90: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
caa0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
cab0: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
cac0: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
cad0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
cae0: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
caf0: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
cb00: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
cb10: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
cb20: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
cb30: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
cb40: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
cb50: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
cb60: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
cb70: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
cb80: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
cb90: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
cba0: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
cbb0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
cbc0: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
cbd0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
cbe0: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
cbf0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
cc00: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
cc10: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
cc20: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
cc30: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
cc40: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
cc50: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
cc60: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
cc70: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
cc80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cc90: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
cca0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
ccb0: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
ccc0: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
ccd0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
cce0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
ccf0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
cd00: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
cd10: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
cd20: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
cd30: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
cd40: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
cd50: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
cd60: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ize);.    if( rc
cd70: 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
cd80: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
cd90: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
cda0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
cdb0: 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
cdc0: 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
cdd0: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
cde0: 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
cdf0: 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
ce00: 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
ce10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
ce20: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
ce30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ce40: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
ce50: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
ce60: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
ce70: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
ce80: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
ce90: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
cea0: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
ceb0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
cec0: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
ced0: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74  hared;.      pBt
cee0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
cef0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
cf00: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
cf10: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
cf20: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
cf30: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
cf40: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
cf50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
cf60: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
cf70: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
cf80: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
cf90: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
cfa0: 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
cfb0: 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
cfc0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
cfd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
cfe0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  MEM;.          d
cff0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d000: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
d010: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
d020: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
d030: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d040: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
d050: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
d060: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
d070: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d080: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d090: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
d0a0: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d0b0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d0c0: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
d0d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
d0e0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
d0f0: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
d100: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
d110: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d120: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
d130: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
d140: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
d150: 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
d160: 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
d170: 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
d180: 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
d190: 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
d1a0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
d1b0: 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
d1c0: 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
d1d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
d1e0: 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
d1f0: 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
d200: 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
d210: 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
d220: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
d230: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
d240: 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
d250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
d260: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
d270: 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
d280: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
d290: 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
d2a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
d2b0: 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
d2c0: 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
d2d0: 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
d2e0: 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
d2f0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
d300: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
d310: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
d320: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
d330: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
d340: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
d350: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d360: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
d370: 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
d380: 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
d390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
d3a0: 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
d3b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d3c0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
d3d0: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
d3e0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
d3f0: 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
d400: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
d410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d420: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
d430: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
d440: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
d450: 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
d460: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
d470: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d480: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
d490: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
d4a0: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
d4b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d4c0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
d4d0: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
d4e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d4f0: 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
d500: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
d510: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d520: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
d530: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
d540: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
d550: 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
d560: 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
d570: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d580: 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
d590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
d5a0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
d5b0: 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
d5c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d5d0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
d5e0: 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
d5f0: 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
d600: 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
d610: 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
d620: 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
d630: 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
d640: 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
d650: 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
d660: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
d670: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
d680: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
d690: 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
d6a0: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
d6b0: 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
d6c0: 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
d6d0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
d6e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d6f0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
d700: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
d710: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68  *pMaster;.  BtSh
d720: 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
d730: 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
d740: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d750: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
d760: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d770: 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    pMaster = sqli
d780: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
d790: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
d7a0: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c  C_MASTER);.  sql
d7b0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d7c0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
d7d0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
d7e0: 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
d7f0: 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
d800: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
d810: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
d820: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
d830: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
d840: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
d850: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
d860: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
d870: 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
d880: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
d890: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
d8a0: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
d8b0: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
d8c0: 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
d8d0: 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
d8e0: 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
d8f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
d900: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
d910: 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
d920: 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
d930: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
d940: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d950: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
d960: 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
d970: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
d980: 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
d990: 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
d9a0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
d9b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d9c0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
d9d0: 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
d9e0: 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
d9f0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
da00: 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
da10: 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
da20: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
da30: 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
da40: 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a  ZE(pBt) bytes..*
da50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
da60: 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
da70: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
da80: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
da90: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
daa0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
dab0: 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
dac0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
dad0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
dae0: 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
daf0: 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
db00: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
db10: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
db20: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
db30: 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
db40: 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
db50: 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
db60: 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
db70: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
db80: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
db90: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
dba0: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
dbb0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
dbc0: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
dbd0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
dbe0: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
dbf0: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
dc00: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
dc10: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
dc20: 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
dc30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dc40: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
dc50: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
dc60: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
dc70: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
dc80: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
dc90: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
dca0: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
dcb0: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
dcc0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
dcd0: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
dce0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
dcf0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
dd00: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
dd10: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
dd20: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
dd30: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
dd40: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
dd50: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
dd60: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
dd70: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
dd80: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
dd90: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
dda0: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
ddb0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
ddc0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
ddd0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
dde0: 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
ddf0: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
de00: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
de10: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
de20: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
de30: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
de40: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
de50: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
de60: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
de70: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
de80: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
de90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
dea0: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
deb0: 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
dec0: 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
ded0: 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
dee0: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
def0: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
df00: 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
df10: 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
df20: 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
df30: 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
df40: 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
df50: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
df60: 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
df70: 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
df80: 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
df90: 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
dfa0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
dfb0: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
dfc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
dfd0: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
dfe0: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
dff0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
e000: 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
e010: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
e020: 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
e030: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
e040: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e050: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
e060: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
e070: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
e080: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
e090: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e0a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
e0b0: 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
e0c0: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
e0d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
e0e0: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
e0f0: 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
e100: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
e110: 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
e120: 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
e130: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
e140: 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
e150: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e170: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
e180: 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
e190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
e1a0: 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
e1b0: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
e1c0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
e1d0: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
e1e0: 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
e1f0: 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
e200: 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
e210: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
e220: 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
e230: 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
e240: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
e250: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
e260: 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
e270: 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
e280: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
e290: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
e2a0: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
e2b0: 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
e2c0: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
e2d0: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
e2e0: 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
e2f0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
e300: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
e310: 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
e320: 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
e330: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
e340: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
e350: 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
e360: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
e370: 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
e380: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
e390: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
e3a0: 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
e3b0: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
e3c0: 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
e3d0: 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
e3e0: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
e3f0: 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
e400: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
e410: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
e420: 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
e430: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
e440: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
e450: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
e460: 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
e470: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
e480: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e490: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
e4a0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
e4b0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e4c0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
e4d0: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
e4e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
e4f0: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
e500: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e510: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
e530: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
e540: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
e550: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
e560: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
e570: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
e580: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
e590: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
e5a0: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
e5b0: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
e5c0: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
e5d0: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
e5e0: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
e5f0: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
e600: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
e610: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
e620: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
e630: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
e640: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
e650: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
e660: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
e670: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
e680: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
e690: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
e6a0: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
e6b0: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
e6c0: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
e6d0: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
e6e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e6f0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
e700: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
e710: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
e720: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
e730: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
e740: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
e750: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
e760: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e770: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e780: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
e790: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
e7a0: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
e7b0: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
e7c0: 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
e7d0: 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
e7e0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
e7f0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
e800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e810: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
e820: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
e830: 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
e840: 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
e850: 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
e860: 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
e870: 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
e880: 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
e890: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
e8a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e8b0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
e8c0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
e8d0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e8e0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
e8f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e900: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
e910: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
e920: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e930: 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
e940: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
e950: 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
e960: 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
e970: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
e980: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
e990: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
e9a0: 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
e9b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e9c0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
e9d0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
e9e0: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
e9f0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
ea00: 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
ea10: 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
ea20: 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
ea30: 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
ea40: 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
ea50: 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
ea60: 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
ea70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
ea80: 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
ea90: 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
eaa0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
eab0: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
eac0: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
ead0: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
eae0: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
eaf0: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
eb00: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
eb10: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
eb20: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
eb30: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
eb40: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
eb50: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
eb60: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
eb70: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
eb80: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
eb90: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
eba0: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
ebb0: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
ebc0: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
ebd0: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
ebe0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
ebf0: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
ec00: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
ec10: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
ec20: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
ec30: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
ec40: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
ec50: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
ec60: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
ec70: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
ec80: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
ec90: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
eca0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
ecb0: 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
ecc0: 20 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78   the pageSizeFix
ecd0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ed flag is set s
ece0: 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
ecf0: 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
ed00: 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
ed10: 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
ed20: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
ed30: 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
ed40: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
ed50: 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
ed60: 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
ed70: 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
ed80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
ed90: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
eda0: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
edb0: 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
edc0: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
edd0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
ede0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
edf0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
ee00: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
ee10: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
ee20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ee30: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
ee40: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
ee50: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
ee60: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
ee70: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
ee80: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
ee90: 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
eea0: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
eeb0: 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
eec0: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
eed0: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
eee0: 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
eef0: 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
ef00: 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
ef10: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
ef20: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
ef30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
ef40: 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
ef50: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
ef60: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
ef70: 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
ef80: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
ef90: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  ce(pBt);.    rc 
efa0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
efb0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
efc0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
efd0: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
efe0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
eff0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f000: 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
f010: 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
f020: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
f030: 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   1;.  sqlite3Btr
f040: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f050: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f060: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
f070: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
f080: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
f090: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
f0a0: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
f0b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
f0c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
f0d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f0e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
f0f0: 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
f100: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
f110: 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
f120: 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
f130: 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
f140: 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
f150: 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
f160: 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
f170: 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
f180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f190: 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
f1a0: 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
f1b0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
f1c0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
f1d0: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
f1e0: 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
f1f0: 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
f200: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f210: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
f220: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
f230: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
f240: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
f250: 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
f260: 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
f270: 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
f280: 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
f290: 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
f2a0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
f2b0: 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
f2c0: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
f2d0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
f2e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f2f0: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
f300: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
f310: 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
f320: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
f330: 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
f340: 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
f350: 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
f360: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
f370: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
f380: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
f390: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
f3a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f3b0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
f3c0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
f3d0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
f3e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
f3f0: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
f400: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
f410: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
f420: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
f430: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
f440: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
f450: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
f460: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
f470: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
f480: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
f490: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
f4a0: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
f4b0: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
f4c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
f4d0: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
f4e0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
f4f0: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
f500: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
f510: 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
f520: 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
f530: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f540: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
f550: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
f560: 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
f570: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
f580: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
f590: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
f5a0: 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
f5b0: 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
f5c0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
f5d0: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
f5e0: 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20  izeFixed && (av 
f5f0: 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
f600: 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
f610: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
f620: 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
f630: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f640: 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
f650: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
f660: 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
f670: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
f680: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
f690: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
f6a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f6b0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
f6c0: 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
f6d0: 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
f6e0: 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
f6f0: 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
f700: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
f710: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
f720: 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
f730: 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
f740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f750: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
f760: 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
f770: 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
f780: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
f790: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
f7a0: 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
f7b0: 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
f7c0: 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
f7d0: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
f7e0: 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
f7f0: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
f800: 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
f810: 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
f820: 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
f830: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
f840: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
f850: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
f860: 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
f870: 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
f880: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f890: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
f8a0: 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
f8b0: 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
f8c0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
f8d0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f8e0: 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
f8f0: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
f900: 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
f910: 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
f920: 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
f930: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
f940: 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
f950: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
f960: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
f970: 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
f980: 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
f990: 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
f9a0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
f9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
f9c0: 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
f9d0: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
f9e0: 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
f9f0: 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67  age1;.  int nPag
fa00: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
fa10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fa20: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
fa30: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
fa40: 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
fa50: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
fa60: 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
fa70: 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
fa80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fa90: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
faa0: 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
fab0: 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
fac0: 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
fad0: 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
fae0: 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
faf0: 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
fb00: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
fb10: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
fb20: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
fb30: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
fb40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fb50: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
fb60: 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20  failed;.  }else 
fb70: 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
fb80: 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b     int pageSize;
fb90: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
fba0: 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
fbb0: 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
fbc0: 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
fbd0: 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
fbe0: 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
fbf0: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
fc00: 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
fc10: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
fc20: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
fc30: 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
fc40: 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
fc50: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
fc60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
fc70: 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
fc80: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
fc90: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
fca0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
fcb0: 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  um embedded frac
fcc0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61  tion must be exa
fcd0: 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74  ctly 25%.  And t
fce0: 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  he minimum.    *
fcf0: 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  * embedded fract
fd00: 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35  ion must be 12.5
fd10: 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d  % for both leaf-
fd20: 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61  data and non-lea
fd30: 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54  f-data..    ** T
fd40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
fd50: 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
fd60: 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
fd70: 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
fd80: 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
fd90: 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
fda0: 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
fdb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
fdc0: 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
fdd0: 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
fde0: 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
fdf0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
fe00: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
fe10: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
fe20: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
fe30: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
fe40: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
fe50: 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65  )!=0 || pageSize
fe60: 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20  <512 ||.        
fe70: 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  (SQLITE_MAX_PAGE
fe80: 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70  _SIZE<32768 && p
fe90: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
fea0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20  AX_PAGE_SIZE).  
feb0: 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
fec0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
fed0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
fee0: 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
fef0: 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73   7)==0 );.    us
ff00: 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
ff10: 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
ff20: 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a  .    if( pageSiz
ff30: 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
ff40: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
ff50: 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
ff60: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
ff70: 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
ff80: 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
ff90: 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
ffa0: 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
ffb0: 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
ffc0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
ffd0: 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
ffe0: 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
fff0: 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
10000 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
10010 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
10020 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
10030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
10040 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
10050 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
10060 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
10070 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
10080 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
10090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
100a0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
100b0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
100c0 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
100d0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
100e0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
100f0 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
10100 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
10110 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
10120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10130 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
10140 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
10150 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
10160 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
10170 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
10180 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  d;.      return 
10190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
101a0 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
101b0 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20  ize<500 ){.     
101c0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
101d0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
101e0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
101f0 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
10200 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
10210 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
10220 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
10230 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10240 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
10250 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
10260 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
10270 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
10280 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
10290 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
102a0 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
102b0 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
102c0 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
102d0 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
102e0 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
102f0 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
10300 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
10310 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
10320 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
10330 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
10340 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
10350 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
10360 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
10370 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
10380 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
10390 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
103a0 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
103b0 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
103c0 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
103d0 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
103e0 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
103f0 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
10400 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
10410 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
10420 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
10430 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
10440 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
10450 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
10460 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
10470 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
10480 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61  2-byte poiner, a
10490 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
104a0 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
104b0 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
104c0 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
104d0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
104e0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
104f0 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
10500 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
10510 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
10520 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
10530 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
10540 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
10550 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
10560 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
10570 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
10580 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75  maxLeaf = pBt->u
10590 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a  sableSize - 35;.
105a0 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
105b0 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
105c0 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
105d0 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  3;.  assert( pBt
105e0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
105f0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
10600 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
10610 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
10620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10630 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
10640 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
10650 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
10660 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
10670 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10680 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10690 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c  ine works like l
106a0 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70  ockBtree() excep
106b0 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69  t that it also i
106c0 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75  nvokes the.** bu
106d0 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
106e0 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e  here is lock con
106f0 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  tention..*/.stat
10700 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
10710 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20  WithRetry(Btree 
10720 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pRef){.  int rc
10730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
10740 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10750 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
10760 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70  pRef) );.  if( p
10770 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  Ref->inTrans==TR
10780 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
10790 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  u8 inTransaction
107a0 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e   = pRef->pBt->in
107b0 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
107c0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
107d0 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  pRef);.    rc = 
107e0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
107f0 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b  nTrans(pRef, 0);
10800 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e  .    pRef->pBt->
10810 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10820 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
10830 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73     pRef->inTrans
10840 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
10850 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52  E_OK ){.      pR
10870 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61  ef->pBt->nTransa
10880 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ction--;.    }. 
10890 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
108a0 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72  y(pRef);.  }.  r
108b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20  eturn rc;.}.    
108c0 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68     ../*.** If th
108d0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
108e0 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
108f0 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
10900 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
10910 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
10920 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
10930 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
10940 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
10950 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
10960 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
10970 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
10980 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
10990 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
109a0 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
109b0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
109c0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
109d0 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
109e0 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20  g cursors, this 
109f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10a00 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
10a10 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
10a20 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
10a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10a40 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10a50 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
10a60 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
10a70 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
10a80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10a90 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10aa0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
10ab0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10ac0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
10ad0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
10ae0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
10af0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
10b00 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
10b10 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e  nt(pBt->pPager)>
10b20 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =1 ){.      asse
10b30 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
10b40 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 20 20  >aData );.      
10b50 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
10b60 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  >pPage1);.    }.
10b70 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
10b80 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
10b90 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64  * Create a new d
10ba0 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
10bb0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
10bc0 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  t page of the.**
10bd0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
10be0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
10bf0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
10c00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
10c10 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10c20 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
10c30 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a  ;.  int nPage;..
10c40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10c50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
10c60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
10c70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
10c80 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
10c90 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
10ca0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10cb0 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b  OK || nPage>0 ){
10cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10cd0 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
10ce0 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
10cf0 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
10d00 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
10d10 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10d20 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
10d30 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
10d40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
10d50 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
10d60 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
10d70 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
10d80 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
10d90 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
10da0 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32  r)==16 );.  put2
10db0 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20  byte(&data[16], 
10dc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
10dd0 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
10de0 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
10df0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
10e00 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
10e10 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
10e20 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
10e30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
10e40 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
10e50 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
10e60 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
10e70 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
10e80 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
10e90 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
10ea0 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
10eb0 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
10ec0 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
10ed0 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
10ee0 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
10ef0 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
10f00 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10f10 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
10f20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10f30 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
10f40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
10f50 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
10f60 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
10f70 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
10f80 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
10f90 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
10fa0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
10fb0 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
10fc0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
10fd0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
10fe0 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
10ff0 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
11000 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
11010 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11020 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
11030 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
11040 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
11050 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
11060 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
11070 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
11080 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
11090 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
110a0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
110b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
110c0 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
110d0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
110e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
110f0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
11100 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
11110 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
11120 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
11130 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
11140 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
11150 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
11160 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
11170 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
11180 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
11190 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
111a0 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
111b0 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
111c0 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
111d0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
111e0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
111f0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
11200 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
11210 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
11220 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
11230 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
11240 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
11250 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
11260 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
11270 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
11280 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
11290 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
112a0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
112b0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
112c0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
112d0 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
112e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
112f0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
11300 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
11310 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
11320 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
11330 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
11340 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
11350 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
11360 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
11370 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
11380 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
11390 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
113a0 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
113b0 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
113c0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
113d0 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
113e0 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
113f0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
11400 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
11410 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
11420 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
11430 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
11440 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
11450 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
11460 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
11470 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
11480 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
11490 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
114a0 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
114b0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
114c0 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
114d0 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
114e0 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
114f0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
11500 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
11510 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
11520 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
11530 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
11540 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
11550 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
11560 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
11570 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
11580 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
11590 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
115a0 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
115b0 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
115c0 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
115d0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
115e0 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
115f0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
11600 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
11610 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
11620 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
11630 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
11640 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
11650 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
11660 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
11670 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
11680 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
11690 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
116a0 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
116b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
116c0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
116d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
116e0 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
116f0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
11700 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
11710 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
11720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
11730 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11740 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
11750 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
11760 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
11770 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
11780 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
11790 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
117a0 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
117b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
117c0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
117d0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
117e0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
117f0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
11800 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11810 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
11820 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11830 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
11840 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
11850 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
11860 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
11870 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
11880 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
11890 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
118a0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
118b0 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
118c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
118d0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
118e0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
118f0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
11900 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
11910 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
11920 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
11930 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
11940 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
11950 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11960 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
11970 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
11980 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
11990 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
119a0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
119b0 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
119c0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
119d0 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
119e0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
119f0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
11a00 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50  ITE) || pBt->isP
11a10 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42  ending ){.    pB
11a20 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
11a30 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
11a40 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
11a50 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
11a60 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
11a70 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
11a80 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
11a90 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
11aa0 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
11ab0 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
11ac0 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
11ad0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
11ae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11af0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
11b00 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
11b10 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
11b20 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
11b30 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
11b40 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
11b50 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
11b60 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
11b70 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
11b80 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
11b90 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
11ba0 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
11bb0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
11bc0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
11bd0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
11be0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
11bf0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
11c00 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
11c10 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
11c20 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
11c30 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
11c40 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
11c50 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
11c60 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
11c70 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
11c80 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
11c90 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
11ca0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
11cb0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
11cc0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
11cd0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
11ce0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
11cf0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
11d00 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
11d10 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
11d20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
11d30 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
11d40 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11d50 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
11d60 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
11d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
11d80 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
11d90 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
11da0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11db0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11dc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11dd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11de0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
11df0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
11e00 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
11e10 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
11e20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
11e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11e40 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
11e50 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
11e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11e70 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
11e80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11e90 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
11ea0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
11eb0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
11ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
11ed0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
11ee0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
11ef0 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
11f00 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
11f10 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
11f20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f30 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
11f40 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
11f50 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
11f60 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
11f70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ++;.    }.    p-
11f80 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
11f90 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
11fa0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
11fb0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
11fc0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
11fd0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
11fe0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
11ff0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
12000 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12010 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12020 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61  HE.    if( wrfla
12030 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
12040 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
12050 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
12060 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
12070 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69    pBt->isExclusi
12080 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67  ve = (u8)(wrflag
12090 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  >1);.    }.#endi
120a0 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  f.  }...trans_be
120b0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
120c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
120d0 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
120e0 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
120f0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
12100 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
12110 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
12120 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
12130 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
12140 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
12150 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
12160 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
12170 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
12180 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
12190 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
121a0 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
121b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
121c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
121d0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
121e0 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
121f0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
12200 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
12210 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12220 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12230 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
12240 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12250 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
12260 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
12270 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
12280 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
12290 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
122a0 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
122b0 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
122c0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
122d0 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
122e0 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
122f0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
12300 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
12310 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
12320 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
12330 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
12340 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
12370 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
12380 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
123b0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
123c0 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
123d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
12400 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
12410 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
12420 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
12430 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
12440 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
12450 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
12460 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12470 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
12480 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
12490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
124a0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
124b0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
124c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
124d0 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
124e0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
124f0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
12500 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
12510 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
12520 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
12530 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
12540 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  , i);..    rc = 
12550 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
12560 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
12570 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
12590 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
125a0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
125b0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
125c0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
125d0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
125e0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
125f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
12600 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
12610 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
12620 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  REE, pgno);.    
12630 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12640 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63  _OK ) goto set_c
12650 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
12660 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
12670 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
12680 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
12690 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
126a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
126b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
126c0 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  8]);.    rc = pt
126d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
126e0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
126f0 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  TREE, pgno);.  }
12700 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
12710 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
12720 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
12730 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
12740 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
12750 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c  ewhere on pPage,
12760 20 77 68 69 63 68 20 69 73 20 67 75 61 72 61 6e   which is guaran
12770 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72  teed to be a btr
12780 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20  ee page, not an 
12790 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
127a0 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  , is a pointer t
127b0 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f  o page iFrom. Mo
127c0 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
127d0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
127e0 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50  nts to.** iTo. P
127f0 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
12800 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
12810 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20  e of pointer to 
12820 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
12830 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  .** follows:.**.
12840 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
12850 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
12860 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
12870 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
12880 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
128b0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
128c0 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
128d0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
128e0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
128f0 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
12900 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12910 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
12920 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
12930 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
12940 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
12950 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
12960 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
12970 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
12980 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
12990 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
129a0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
129b0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
129c0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
129d0 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
129e0 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
129f0 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
12a00 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
12a10 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
12a20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12a30 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
12a40 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12a50 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
12a60 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
12a70 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
12a80 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
12a90 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
12aa0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
12ab0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
12ac0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
12ad0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
12ae0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
12af0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
12b00 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
12b10 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
12b20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12b30 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
12b40 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
12b50 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
12b60 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
12b70 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
12b80 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
12b90 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
12ba0 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ll;..    sqlite3
12bb0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
12bc0 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
12bd0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
12be0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12bf0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
12c00 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
12c10 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
12c20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
12c30 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
12c40 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
12c50 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
12c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
12c70 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
12c80 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
12c90 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
12ca0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
12cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
12cc0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
12cd0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
12ce0 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20  verflow]) ){.   
12cf0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
12d00 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
12d10 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
12d20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
12d30 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
12d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
12d60 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
12d70 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
12d80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
12d90 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
12da0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12dc0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
12dd0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
12de0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
12df0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
12e00 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
12e10 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
12e20 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
12e30 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
12e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12e50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12e60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12e70 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
12e80 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
12e90 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
12ea0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
12eb0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
12ec0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
12ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12ee0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
12ef0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
12f00 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
12f10 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
12f20 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
12f30 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
12f40 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
12f50 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
12f60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
12f70 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
12f80 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
12f90 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
12fa0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
12fb0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
12fc0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
12fd0 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
13000 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
13010 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
13020 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
13030 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
13040 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
13050 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
13060 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
13070 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
13080 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
13090 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
130a0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
130b0 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  mit.){.  MemPage
130c0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
130d0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
130e0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
130f0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
13100 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
13110 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
13120 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
13130 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
13140 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
13150 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
13160 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
13170 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
13180 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
13190 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
131a0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
131b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
131c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
131d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
131e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
131f0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
13200 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
13210 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
13220 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
13230 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
13240 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
13250 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
13260 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
13270 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
13280 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
13290 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
132a0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
132b0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
132c0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
132d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
132e0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
132f0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
13300 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
13310 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
13320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13330 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13340 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
13350 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
13360 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
13370 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
13380 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
13390 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
133a0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
133b0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
133c0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
133d0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
133e0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
133f0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
13400 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
13410 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
13420 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
13430 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
13440 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
13450 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
13460 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
13470 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
13480 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
13490 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
134a0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
134b0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
134c0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
134d0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
134e0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
134f0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
13500 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
13510 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
13520 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
13530 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
13540 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
13550 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
13560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13570 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13580 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
13590 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
135a0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
135b0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
135c0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
135d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
135e0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
135f0 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
13600 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
13610 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  ePage);.      if
13620 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13630 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13640 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
13650 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
13660 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
13670 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
13680 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
13690 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
136a0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
136b0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
136c0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
136d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
136e0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
136f0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
13700 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
13710 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
13720 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
13730 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
13740 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
13750 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
13760 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13770 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13780 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13790 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
137a0 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
137b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
137c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
137d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
137e0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
137f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13800 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
13810 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
13820 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
13830 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
13840 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
13850 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
13860 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
13880 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
13890 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
138a0 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20  pe, iPtrPage);. 
138b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
138c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
138d0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
138e0 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
138f0 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
13900 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
13910 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
13920 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
13930 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
13940 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
13950 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
13960 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
13970 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
13980 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
13990 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
139a0 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
139b0 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
139c0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a  nd therefore no.
139d0 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c  ** point in call
139e0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
139f0 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
13a00 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
13a10 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
13a20 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  cly, this functi
13a30 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
13a40 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a  e-organize the .
13a50 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  ** database so t
13a60 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
13a70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
13a80 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a  rrently in use.*
13a90 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  * is no longer i
13aa0 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n use..**.** If 
13ab0 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74  the nFin paramet
13ac0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
13ad0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
13ae0 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68  on assumes.** th
13af0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
13b00 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
13b10 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
13b20 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74   until.** it ret
13b30 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
13b40 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e   or an error, an
13b50 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74  d that nFin is t
13b60 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
13b70 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61  pages the databa
13b80 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e  se file will con
13b90 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20  tain after this 
13ba0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63  .** process is c
13bb0 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74  omplete..*/.stat
13bc0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
13bd0 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
13be0 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
13bf0 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20  Pgno iLastPg){. 
13c00 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
13c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13c20 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
13c30 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
13c40 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
13c50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13c60 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
13c70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
13c80 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a  LastPg>nFin );..
13c90 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
13ca0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
13cb0 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
13cc0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
13cd0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  (pBt) ){.    int
13ce0 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70   rc;.    u8 eTyp
13cf0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
13d00 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
13d10 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
13d20 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
13d30 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
13d40 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
13d50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13d60 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
13d70 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
13d80 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
13d90 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
13da0 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
13db0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13dc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13de0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
13df0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
13e00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13e10 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
13e20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
13e30 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
13e40 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  E ){.      if( n
13e50 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Fin==0 ){.      
13e60 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
13e70 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
13e80 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
13e90 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
13ea0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
13eb0 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65  f nFin is non-ze
13ec0 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
13ed0 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
13ee0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
13ef0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
13f00 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
13f10 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
13f20 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
13f30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
13f40 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
13f50 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
13f60 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
13f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13f80 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
13f90 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
13fa0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
13fb0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
13fc0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
13fd0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
13fe0 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20   iLastPg, 1);.  
13ff0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14010 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14030 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
14040 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
14050 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14060 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
14070 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
14080 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
14090 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
140a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
140b0 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
140c0 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
140d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
140e0 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  tPg;..      rc =
140f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
14100 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
14110 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
14120 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
14130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14150 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
14160 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
14170 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
14180 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
14190 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
141a0 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
141b0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
141c0 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
141d0 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
141e0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
141f0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
14200 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46  ther hand, if nF
14210 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68  in is greater th
14220 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
14230 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
14240 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
14250 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
14260 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
14270 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
14280 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
14290 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
142a0 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  /.      do {.   
142b0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
142c0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
142d0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
142e0 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
142f0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30  ePg, &iFreePg, 0
14300 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
14310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
14330 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
14340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14350 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14360 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
14370 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
14380 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46        }while( nF
14390 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67  in!=0 && iFreePg
143a0 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
143b0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
143c0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
143d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
143e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
143f0 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  astPg->pDbPage);
14400 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
14410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14420 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
14430 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
14440 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
14450 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46  age, iFreePg, nF
14460 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  in!=0);.      }.
14470 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14480 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
14490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
144a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
144b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
144c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
144d0 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
144e0 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
144f0 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d   while( iLastPg=
14500 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
14510 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
14520 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
14530 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tPg) ){.      if
14540 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
14550 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
14560 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
14570 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69   *pPg;.        i
14580 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
14590 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
145a0 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20   iLastPg, &pPg, 
145b0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
145c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
145d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
145e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
145f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14600 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
14610 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
14620 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14630 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
14640 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14650 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
14660 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14670 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14680 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
14690 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
146a0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
146b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c  (pBt->pPager, iL
146c0 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  astPg);.  }.  re
146d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
146e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
146f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
14700 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
14710 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
14720 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
14730 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
14740 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
14750 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
14760 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
14770 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
14780 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
14790 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
147a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
147b0 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
147c0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
147d0 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
147e0 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
147f0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
14800 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
14810 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
14820 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
14830 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
14840 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
14850 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
14860 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
14870 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14880 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
14890 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
148a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
148b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
148c0 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
148d0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
148e0 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
148f0 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
14900 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14910 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
14920 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
14930 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
14940 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
14950 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
14960 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50 61 67  pBt, 0, pagerPag
14970 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20  ecount(pBt));.  
14980 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
14990 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
149a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
149b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
149c0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
149d0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
149e0 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
149f0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
14a00 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  ited for an auto
14a10 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
14a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
14a30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14a40 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
14a50 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
14a60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
14a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14a80 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
14a90 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
14aa0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
14ab0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
14ac0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
14ad0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
14ae0 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
14af0 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
14b00 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
14b10 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
14b20 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
14b30 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
14b40 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
14b50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
14b60 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
14b70 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
14b80 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
14b90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
14ba0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
14bb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14bc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14bd0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
14be0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
14bf0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
14c00 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
14c10 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
14c20 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
14c30 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
14c40 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  in;.    Pgno nFr
14c50 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74  ee;.    Pgno nPt
14c60 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f 20 69  rmap;.    Pgno i
14c70 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Free;.    const 
14c80 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e  int pgsz = pBt->
14c90 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 50 67  pageSize;.    Pg
14ca0 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72  no nOrig = pager
14cb0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
14cc0 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
14cd0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
14ce0 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
14cf0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
14d00 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
14d10 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
14d20 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
14d30 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
14d40 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
14d50 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
14d60 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
14d70 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
14d80 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
14d90 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
14da0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
14db0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
14dc0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
14dd0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
14de0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14df0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
14e00 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
14e10 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
14e20 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
14e30 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
14e40 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
14e50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
14e60 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f  )+pgsz/5)/(pgsz/
14e70 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e  5);.    nFin = n
14e80 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
14e90 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20  Ptrmap;.    if( 
14ea0 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
14eb0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
14ec0 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
14ed0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
14ee0 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
14ef0 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54   }.    while( PT
14f00 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
14f10 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
14f20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
14f30 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
14f40 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
14f50 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
14f60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14f70 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
14f80 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
14f90 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
14fa0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
14fb0 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
14fc0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
14fd0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
14fe0 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20   iFree);.    }. 
14ff0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
15000 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
15010 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
15020 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
15030 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15050 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
15060 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
15070 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
15080 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
15090 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
150a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
150b0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
150c0 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
150d0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
150e0 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
150f0 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20  Pager, nFin);.  
15100 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
15110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15120 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
15130 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
15140 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
15150 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
15160 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
15170 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
15180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
15190 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
151a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
151b0 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
151c0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
151d0 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
151e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
151f0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
15200 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
15210 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
15220 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
15230 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
15240 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
15250 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
15260 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
15270 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
15280 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
15290 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
152a0 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
152b0 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
152c0 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
152d0 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
152e0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
152f0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
15300 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
15310 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
15320 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15330 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
15340 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
15350 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
15360 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
15370 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
15380 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
15390 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
153a0 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
153b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
153c0 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
153d0 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
153e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
153f0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
15400 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
15410 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
15420 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
15430 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
15440 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
15450 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
15460 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
15470 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
15480 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
15490 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
154a0 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
154b0 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
154c0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
154d0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
154e0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
154f0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
15500 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
15510 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
15520 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
15530 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
15540 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
15550 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
15560 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
15570 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
15580 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
15590 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
155a0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
155b0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
155c0 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
155d0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
155e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
155f0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
15600 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
15610 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
15620 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
15630 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
15640 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
15650 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
15660 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
15670 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
15680 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
15690 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
156a0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
156b0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
156c0 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
156d0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
156e0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
156f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
15700 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
15710 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
15720 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
15730 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
15740 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
15750 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
15760 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
15770 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
15780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
15790 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
157a0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
157b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
157c0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
157d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
157e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
157f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
15800 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
15810 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
15820 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
15830 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
15840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15860 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15870 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
15880 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15890 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
158a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
158b0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
158c0 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
158d0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
158e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
158f0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
15900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15910 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
15920 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
15930 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
15940 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15950 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
15960 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
15970 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
15980 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
15990 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
159a0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
159b0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
159c0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
159d0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
159e0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
159f0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
15a00 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
15a10 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
15a20 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
15a30 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
15a40 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
15a50 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
15a60 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
15a70 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
15a80 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
15a90 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
15aa0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
15ab0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
15ac0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
15ad0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
15ae0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
15af0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
15b00 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
15b10 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
15b20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15b30 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
15b40 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
15b50 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
15b60 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
15b70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15b80 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
15b90 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
15ba0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
15bb0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
15bc0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
15bd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15be0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
15bf0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
15c00 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15c10 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
15c20 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15c30 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
15c40 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
15c50 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
15c60 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
15c70 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
15c80 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
15c90 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
15ca0 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
15cb0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
15cc0 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
15cd0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
15ce0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
15cf0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
15d00 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
15d10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15d20 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
15d30 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
15d40 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
15d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15d60 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
15d70 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15d80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15d90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
15da0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15db0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
15dc0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
15dd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15de0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
15df0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
15e00 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
15e10 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
15e20 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
15e30 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
15e40 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
15e50 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
15e60 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
15e70 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
15e80 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
15e90 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
15ea0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
15eb0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
15ec0 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
15ed0 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
15ee0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
15ef0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15f00 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
15f10 4f 4e 45 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  ONE ){.    clear
15f20 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
15f30 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
15f40 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15f50 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
15f60 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
15f70 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
15f80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
15f90 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
15fa0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
15fb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
15fc0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
15fd0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
15fe0 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65   unlock.  ** the
15ff0 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
16000 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
16010 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
16020 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
16030 20 2a 2f 0a 20 20 62 74 72 65 65 43 6c 65 61 72   */.  btreeClear
16040 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
16050 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
16060 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e  TRANS_NONE;.  un
16070 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
16080 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
16090 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
160a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
160b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
160c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
160d0 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
160e0 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
160f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16100 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
16110 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
16120 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16130 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
16140 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
16150 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
16160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16170 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
16180 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
16190 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20  tPhaseTwo(p);.  
161a0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
161b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
161c0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
161d0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
161e0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
161f0 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
16200 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
16210 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
16220 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
16230 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
16240 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
16250 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
16260 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
16270 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  fined..**.** For
16280 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
16290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
162a0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
162b0 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
162c0 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
162d0 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  f writing to the
162e0 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20   databse.  That 
162f0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72  means the cursor
16300 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   was.** original
16310 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  ly opened for wr
16320 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75  iting and the cu
16330 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20  rsor has not be 
16340 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68  disabled.** by h
16350 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20  aving its state 
16360 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f  changed to CURSO
16370 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74  R_FAULT..*/.stat
16380 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
16390 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
163a0 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
163b0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
163c0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
163d0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
163e0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
163f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
16400 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26  ( pCur->wrFlag &
16410 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
16420 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
16430 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
16440 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
16450 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16460 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
16470 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
16480 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
16490 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
164a0 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
164b0 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
164c0 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
164d0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
164e0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
164f0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
16500 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
16510 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
16520 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
16530 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
16540 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
16550 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
16560 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
16570 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
16580 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
16590 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
165a0 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
165b0 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
165c0 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
165d0 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
165e0 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
165f0 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
16600 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
16610 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
16620 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
16630 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
16640 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
16650 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
16660 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
16670 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
16680 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
16690 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
166a0 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
166b0 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
166c0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
166d0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
166e0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
166f0 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
16700 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c  Cursor *p;.  sql
16710 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16720 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
16730 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
16740 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
16750 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
16760 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
16770 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
16780 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
16790 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
167a0 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72     p->skip = err
167b0 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Code;.    for(i=
167c0 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
167d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
167e0 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
167f0 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e[i]);.      p->
16800 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
16810 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
16820 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
16830 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
16840 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
16850 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
16860 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
16870 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
16880 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
16890 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
168a0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
168b0 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
168c0 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
168d0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
168e0 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
168f0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
16900 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
16910 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
16920 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
16930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16940 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
16950 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
16960 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
16970 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
16980 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
16990 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
169a0 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ack(Btree *p){. 
169b0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
169c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
169d0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
169e0 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
169f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16a00 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
16a10 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
16a20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16a30 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16a40 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
16a50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
16a60 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
16a70 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
16a80 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
16a90 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
16aa0 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79  hilst.    ** try
16ab0 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73  ing to save curs
16ac0 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66  or positions. If
16ad0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
16ae0 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28  matic rollback (
16af0 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  as.    ** the re
16b00 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72  sult of a constr
16b10 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66  aint, malloc() f
16b20 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72  ailure or IO err
16b30 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  or) then .    **
16b40 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62   the cache may b
16b50 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63  e internally inc
16b60 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63  onsistent (not c
16b70 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65  ontain valid tre
16b80 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65  es) so.    ** we
16b90 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72   cannot simply r
16ba0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
16bb0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49  to the caller. I
16bc0 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20  nstead, abort . 
16bd0 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65     ** all querie
16be0 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  s that may be us
16bf0 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63  ing any of the c
16c00 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c  ursors that fail
16c10 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20  ed to save..    
16c20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
16c30 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
16c40 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65  s(p, rc);.  }.#e
16c50 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65  ndif.  btreeInte
16c60 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
16c70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
16c80 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
16c90 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
16ca0 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
16cb0 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
16cc0 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
16cd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
16ce0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
16cf0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
16d00 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
16d10 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
16d20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
16d30 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
16d40 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
16d50 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
16d60 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
16d70 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74  * call sqlite3Bt
16d80 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
16d90 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
16da0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
16db0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
16dc0 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
16dd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
16de0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
16df0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
16e00 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
16e10 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
16e20 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
16e30 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
16e40 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
16e50 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
16e60 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
16e70 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
16e80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69  .  }..  if( p->i
16e90 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
16ea0 4e 45 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 41  NE ){.    clearA
16eb0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
16ec0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
16ed0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
16ee0 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
16ef0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
16f00 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
16f10 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
16f20 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
16f30 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16f40 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
16f50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65     }.  }..  btre
16f60 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
16f70 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72  (pBt);.  p->inTr
16f80 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
16f90 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
16fa0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
16fb0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
16fc0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
16fd0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16fe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16ff0 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
17000 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
17010 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
17020 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62  action can can b
17030 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
17040 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
17050 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
17060 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
17070 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
17080 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
17090 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
170a0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
170b0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
170c0 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
170d0 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
170e0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
170f0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
17100 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
17110 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
17120 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
17130 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
17140 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
17150 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
17160 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
17170 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
17180 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
17190 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
171a0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
171b0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
171c0 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
171d0 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
171e0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
171f0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
17200 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
17210 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
17220 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
17230 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
17240 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
17250 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
17260 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
17270 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
17280 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
17290 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
172a0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
172b0 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
172c0 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
172d0 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
172e0 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
172f0 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
17300 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
17310 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
17320 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
17330 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
17340 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
17350 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
17360 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
17370 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
17380 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
17390 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
173a0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
173b0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
173c0 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
173d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
173e0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
173f0 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
17400 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
17410 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
17420 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
17430 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17440 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
17450 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
17460 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
17470 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  t( pBt->readOnly
17480 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
17490 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
174a0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
174b0 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
174c0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28  vepoint );.  if(
174d0 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e   NEVER(p->inTran
174e0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s!=TRANS_WRITE |
174f0 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29  | pBt->readOnly)
17500 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
17510 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
17520 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
17530 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
17540 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
17550 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20  TE );.    /* At 
17560 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
17570 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
17580 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
17590 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20  vepoint with.   
175a0 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
175b0 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
175c0 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
175d0 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
175e0 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61  g.    ** SQL sta
175f0 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
17600 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
17610 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
17620 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73  ack any.    ** s
17630 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
17640 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
17650 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
17660 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
17670 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ve..    */.    r
17680 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17690 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
176a0 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
176b0 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ement);.  }.  sq
176c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
176d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
176e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
176f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
17700 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
17710 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
17720 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
17730 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
17740 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
17750 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
17760 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
17770 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
17780 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
17790 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
177a0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
177b0 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
177c0 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
177d0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
177e0 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
177f0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
17800 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
17810 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
17820 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
17830 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
17840 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
17850 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
17860 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
17870 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
17880 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
17890 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
178a0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
178b0 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
178c0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
178d0 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
178e0 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
178f0 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
17900 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
17910 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
17920 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
17930 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
17940 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
17950 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
17970 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
17980 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
17990 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
179a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
179b0 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
179c0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
179d0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
179e0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
179f0 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
17a00 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
17a10 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
17a20 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
17a30 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
17a40 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17a50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17a60 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
17a70 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
17a80 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
17a90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17aa0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
17ab0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
17ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17ad0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17ae0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17af0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
17b00 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
17b10 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
17b20 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
17b30 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
17b40 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61  e.  The act of a
17b50 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f  cquiring a curso
17b60 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f  r gets a read lo
17b70 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
17b80 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
17b90 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
17ba0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
17bb0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
17bc0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
17bd0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
17be0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
17bf0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
17c00 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
17c10 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
17c20 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
17c30 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
17c40 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
17c50 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
17c60 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
17c70 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
17c80 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
17c90 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
17ca0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
17cb0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
17cc0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
17cd0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
17ce0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
17cf0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
17d00 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
17d10 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
17d20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
17d30 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
17d40 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
17d50 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
17d60 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
17d70 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
17d80 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
17d90 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
17da0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
17db0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
17dc0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
17dd0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
17de0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
17df0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
17e00 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
17e10 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
17e20 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
17e30 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
17e40 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
17e50 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
17e60 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
17e70 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
17e80 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
17e90 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
17ea0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
17eb0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
17ec0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
17ed0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
17ee0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
17ef0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
17f00 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
17f10 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
17f20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
17f30 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
17f40 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
17f50 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
17f60 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d  ize() bytes of m
17f70 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65  emory .** pointe
17f80 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61 76  d to by pCur hav
17f90 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  e been zeroed by
17fa0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
17fb0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
17fc0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
17fd0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
18000 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
18030 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
18040 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
18050 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
18080 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
18090 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
180a0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
180b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
180c0 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
180d0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
180e0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
180f0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
18100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
18110 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
18120 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
18130 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  c;.  Pgno nPage;
18140 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18150 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
18160 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
18170 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
18180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
18190 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
181a0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 77 72 46  ==1 );.  if( wrF
181b0 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  lag ){.    asser
181c0 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
181d0 79 20 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  y );.    if( NEV
181e0 45 52 28 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ER(pBt->readOnly
181f0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
18200 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
18210 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  Y;.    }.    rc 
18220 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f  = checkForReadCo
18230 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
18240 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
18250 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18260 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
18280 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  ED_SHAREDCACHE )
18290 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
182a0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
182b0 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
182c0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  =0 ){.    rc = l
182d0 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
182e0 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  y(p);.    if( rc
182f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18300 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18310 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
18320 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
18330 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63 20  no)iTable;.  rc 
18340 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
18350 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
18360 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61  ger, (int *)&nPa
18370 67 65 29 3b 20 0a 20 20 69 66 28 20 72 63 21 3d  ge); .  if( rc!=
18380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18390 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
183a0 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
183b0 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  && nPage==0 ){. 
183c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
183d0 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63  MPTY;.    goto c
183e0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
183f0 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63  eption;.  }.  rc
18400 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
18410 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
18420 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
18430 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20  Page[0]);.  if( 
18440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18450 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
18460 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
18470 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
18480 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
18490 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
184a0 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
184b0 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
184c0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
184d0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
184e0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
184f0 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
18500 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
18510 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
18520 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
18530 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
18540 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
18550 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
18560 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
18570 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
18580 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
18590 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
185a0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
185b0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
185c0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
185d0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
185e0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
185f0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
18600 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
18610 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
18620 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
18630 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
18640 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18650 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72  _OK;..create_cur
18660 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20  sor_exception:. 
18670 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
18680 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
18690 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
186a0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74  used(pBt);.  ret
186b0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
186c0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
186d0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
18710 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18740 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
18750 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
18760 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18790 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
187a0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
187b0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
187c0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
187d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
187e0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
187f0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
18800 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18820 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
18830 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
18840 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
18850 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18860 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
18870 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
18880 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
18890 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
188a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
188b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
188c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
188d0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
188e0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
188f0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
18900 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
18910 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
18920 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
18930 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
18940 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
18950 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
18960 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
18970 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
18980 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
18990 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
189a0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
189b0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
189c0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
189d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
189e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
189f0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
18a00 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
18a10 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
18a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
18a30 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
18a40 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63  value of every c
18a50 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d  ursor in the sam
18a60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
18a70 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68  ** as pCur and h
18a80 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72  aving the same r
18a90 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
18aa0 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61  as pCur.  The va
18ab0 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
18ac0 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f   iRowid..**.** O
18ad0 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77  nly positive row
18ae0 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  id values are co
18af0 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66  nsidered valid f
18b00 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a  or this cache..*
18b10 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69  * The cache is i
18b20 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
18b30 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  ro, indicating a
18b40 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e  n invalid cache.
18b50 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c  .** A btree will
18b60 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20   work fine with 
18b70 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
18b80 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73   rowids.  We jus
18b90 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68  t cannot.** cach
18ba0 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  e zero or negati
18bb0 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68  ve rowids, which
18bc0 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68   means tables th
18bd0 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a  at use zero or.*
18be0 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  * negative rowid
18bf0 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
18c00 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75  ttle slower.  Bu
18c10 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a  t in practice, z
18c20 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69  ero.** or negati
18c30 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65  ve rowids are ve
18c40 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74  ry uncommon so t
18c50 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  his should not b
18c60 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
18c70 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
18c80 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
18c90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18ca0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
18cb0 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f  owid){.  BtCurso
18cc0 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43  r *p;.  for(p=pC
18cd0 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ur->pBt->pCursor
18ce0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
18cf0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
18d00 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
18d10 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65  oRoot ) p->cache
18d20 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  dRowid = iRowid;
18d30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18d40 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
18d50 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f  ==iRowid );.}../
18d60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18d70 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72  cached rowid for
18d80 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
18d90 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f  r.  A negative o
18da0 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e  r zero.** return
18db0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
18dc0 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
18dd0 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
18de0 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a   and should be.*
18df0 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74  * ignored.  If t
18e00 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68  he rowid cache h
18e10 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
18e20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61  been set, then a
18e30 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75  .** zero is retu
18e40 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rned..*/.sqlite3
18e50 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
18e60 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69  reeGetCachedRowi
18e70 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
18e80 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
18e90 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d  ->cachedRowid;.}
18ea0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
18eb0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
18ec0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
18ed0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
18ee0 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
18ef0 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
18f00 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
18f10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
18f20 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
18f30 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
18f40 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
18f50 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
18f60 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
18f70 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
18f80 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
18f90 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
18fa0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
18fb0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
18fc0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
18fd0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
18fe0 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
18ff0 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
19000 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
19010 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
19020 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
19030 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
19040 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
19050 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
19060 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
19070 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
19080 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
19090 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
190a0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
190b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
190c0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
190d0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
190e0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
190f0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
19100 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
19110 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
19120 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
19130 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
19140 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19150 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
19160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19170 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
19180 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 4d 61 6b  E_TEST./*.** Mak
19190 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
191a0 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20  rsor by filling 
191b0 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  in the fields of
191c0 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68   pTempCur..** Th
191d0 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  e temporary curs
191e0 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  or is not on the
191f0 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72   cursor list for
19200 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76   the Btree..*/.v
19210 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
19220 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74  GetTempCursor(Bt
19230 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74  Cursor *pCur, Bt
19240 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72  Cursor *pTempCur
19250 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
19260 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19270 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19280 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75    memcpy(pTempCu
19290 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28  r, pCur, sizeof(
192a0 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 54  BtCursor));.  pT
192b0 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20  empCur->pNext = 
192c0 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70  0;.  pTempCur->p
192d0 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Prev = 0;.  for(
192e0 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72  i=0; i<=pTempCur
192f0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
19300 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
19310 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61 70 50  ef(pTempCur->apP
19320 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29  age[i]->pDbPage)
19330 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19340 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79 3d 3d  pTempCur->pKey==
19350 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  0 );.}.#endif /*
19360 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
19370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19380 45 53 54 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  EST./*.** Delete
19390 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
193a0 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
193b0 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
193c0 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
193d0 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
193e0 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  above..*/.void s
193f0 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
19400 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  seTempCursor(BtC
19410 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
19420 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
19430 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19440 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f 72  x(pCur) );.  for
19450 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
19460 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
19470 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19480 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  f(pCur->apPage[i
19490 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ]->pDbPage);.  }
194a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
194b0 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 23  pCur->pKey);.}.#
194c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
194d0 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  TEST */../*.** M
194e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
194f0 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
19500 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
19510 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
19520 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
19530 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
19540 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
19550 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65  , call.** sqlite
19560 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
19570 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
19580 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
19590 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
195a0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
195b0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
195c0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
195d0 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
195e0 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
195f0 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
19600 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
19610 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
19620 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
19630 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
19640 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
19650 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
19660 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
19670 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
19680 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
19690 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
196a0 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
196b0 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
196c0 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
196d0 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
196e0 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
196f0 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
19700 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
19710 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
19720 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
19730 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
19740 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
19750 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
19760 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
19770 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
19780 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
19790 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
197a0 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
197b0 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
197c0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
197d0 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
197e0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
197f0 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
19800 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
19810 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
19820 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
19830 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
19840 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
19850 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
19860 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
19870 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
19880 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
19890 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
198a0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
198b0 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
198c0 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
198d0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
198e0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
198f0 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
19900 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
19910 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
19920 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
19930 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
19940 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
19950 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
19960 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
19970 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19980 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
19990 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
199a0 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
199b0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
199c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
199d0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
199e0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
199f0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
19a00 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
19a10 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
19a20 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
19a30 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
19a40 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
19a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
19a60 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
19a70 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
19a80 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
19a90 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
19aa0 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
19ab0 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
19ac0 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
19ad0 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
19b20 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
19b70 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33     \.    sqlite3
19bc0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
19bd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
19be0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
19bf0 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
19c00 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
19c10 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
19cb0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
19cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
19d00 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
19d10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
19d20 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
19d30 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
19d40 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
19d50 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
19d60 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
19d70 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
19d80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
19d90 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
19da0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
19db0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
19dc0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
19dd0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
19de0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
19df0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
19e00 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
19e10 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
19e20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19e30 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
19e40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19e50 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
19e60 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
19e70 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
19e80 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19e90 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19ea0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
19eb0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
19ec0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
19ed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19ef0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19f00 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
19f10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19f20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
19f30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19f40 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
19f50 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
19f60 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
19f70 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
19f80 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
19f90 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
19fa0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
19fb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19fc0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
19fd0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
19fe0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
19ff0 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1a000 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1a010 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1a020 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
1a030 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
1a040 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1a050 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
1a060 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
1a070 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
1a080 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
1a090 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
1a0a0 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
1a0b0 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
1a0c0 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
1a0d0 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
1a0e0 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
1a0f0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1a100 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1a110 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1a120 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1a130 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1a140 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1a150 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1a160 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1a170 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1a180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1a190 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1a1a0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1a1b0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1a1c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1a1d0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1a1e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a1f0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
1a200 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
1a210 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
1a220 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
1a230 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
1a240 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
1a250 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
1a260 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1a270 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
1a280 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
1a290 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a2a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
1a2b0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1a2c0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1a2d0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1a2e0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1a2f0 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1a300 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1a310 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1a320 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1a330 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1a340 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1a350 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1a360 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1a370 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1a380 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1a390 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1a3a0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1a3b0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1a3c0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1a3d0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1a3e0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1a3f0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a400 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1a410 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1a420 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1a430 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1a440 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1a450 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1a460 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1a470 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1a480 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1a490 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1a4a0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1a4b0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1a4c0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1a4d0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1a4e0 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1a4f0 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1a500 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1a510 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1a520 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1a530 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1a540 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1a550 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1a560 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1a570 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1a580 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1a590 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1a5a0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1a5b0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1a5c0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1a5d0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1a5e0 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1a5f0 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1a600 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1a610 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1a620 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1a630 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1a640 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1a650 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1a660 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1a670 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1a680 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
1a690 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1a6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
1a6b0 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
1a6c0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a6e0 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
1a6f0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
1a700 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
1a710 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
1a720 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
1a730 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1a740 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
1a750 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
1a760 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1a770 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a780 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1a790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1a7a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1a7b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1a7c0 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1a7d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a7e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1a7f0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1a800 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1a810 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1a820 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1a830 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1a840 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1a850 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1a860 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1a870 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1a880 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1a890 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1a8a0 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1a8b0 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1a8c0 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1a8d0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1a8e0 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1a8f0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1a900 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1a910 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1a920 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1a930 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1a940 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1a950 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1a960 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1a970 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1a980 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1a990 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1a9a0 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1a9b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1a9c0 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1a9d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1a9e0 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
1a9f0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1aa00 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1aa10 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1aa20 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1aa30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1aa40 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1aa50 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1aa60 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1aa70 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1aa80 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1aa90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1aaa0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1aab0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1aac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1aad0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1aae0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1aaf0 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1ab00 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1ab10 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1ab20 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
1ab30 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
1ab40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1ab50 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1ab60 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1ab70 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1ab80 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1ab90 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1aba0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1abb0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1abc0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1abd0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1abe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1abf0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1ac00 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1ac10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1ac20 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1ac30 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1ac40 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1ac50 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1ac60 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1ac70 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1ac80 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1ac90 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1aca0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1acb0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1acc0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1acd0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1ace0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1acf0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1ad00 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1ad10 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1ad20 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1ad30 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1ad40 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1ad50 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1ad60 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1ad70 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1ad80 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1ad90 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1ada0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1adb0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1adc0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1add0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1ade0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1adf0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1ae00 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1ae10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1ae20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1ae30 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1ae40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1ae50 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1ae60 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae80 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1ae90 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1aea0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1aeb0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1aec0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1aed0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1aee0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1aef0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1af00 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1af10 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1af20 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1af30 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1af40 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1af50 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1af60 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1af70 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1af80 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1af90 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1afa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1afb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1afc0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1afd0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1afe0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1aff0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1b000 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1b010 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1b020 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1b030 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1b040 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1b050 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1b060 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1b070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b080 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1b090 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1b0a0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1b0b0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1b0c0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1b0d0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1b0e0 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1b0f0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1b100 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1b110 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1b120 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1b130 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1b140 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1b150 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1b160 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1b170 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1b180 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1b190 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1b1a0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1b1b0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1b1c0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1b1d0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1b1e0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1b1f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b200 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
1b210 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
1b220 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
1b230 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
1b240 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
1b250 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
1b260 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
1b270 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
1b280 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1b290 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
1b2a0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1b2b0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
1b2c0 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
1b2d0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1b2e0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1b2f0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1b300 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1b310 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1b320 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1b330 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1b340 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1b350 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1b360 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1b370 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1b380 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1b390 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1b3a0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1b3b0 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1b3c0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1b3d0 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1b3e0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1b3f0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1b400 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1b410 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1b420 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1b430 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1b440 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1b450 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1b460 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1b470 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1b480 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1b490 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1b4a0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1b4b0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1b4c0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1b4d0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1b4e0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1b4f0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1b500 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1b510 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1b520 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1b530 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1b540 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1b550 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1b560 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1b570 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1b580 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1b590 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1b5a0 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1b5b0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1b5c0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1b5d0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1b5e0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1b5f0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1b600 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1b610 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1b620 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1b630 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1b640 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1b650 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1b660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b670 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1b680 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1b690 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1b6a0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1b6b0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1b6c0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
1b6d0 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
1b6e0 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
1b6f0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1b700 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1b710 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1b720 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1b730 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1b740 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1b750 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1b760 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1b770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1b780 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1b790 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1b7a0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1b7b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b7c0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1b7d0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1b7e0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1b7f0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1b800 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1b810 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1b820 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1b830 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1b840 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1b850 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b860 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b870 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1b880 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b890 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1b8a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1b8b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1b8c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1b8d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1b8e0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1b8f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1b900 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1b910 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1b920 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1b930 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1b940 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1b950 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1b960 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
1b970 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
1b980 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1b990 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a  ur->info.nData .
1b9a0 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1b9b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1b9c0 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1b9d0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1b9e0 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1b9f0 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1ba00 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1ba10 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1ba20 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1ba30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ba40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ba50 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1ba60 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1ba70 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1ba80 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1ba90 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1baa0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1bab0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1bac0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1bad0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1bae0 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1baf0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1bb00 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1bb10 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1bb20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1bb30 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1bb40 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1bb50 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1bb60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1bb70 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1bb80 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1bb90 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1bba0 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1bbb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1bbc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1bbd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1bbe0 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1bbf0 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1bc00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1bc10 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1bc20 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1bc30 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1bc40 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1bc50 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1bc60 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1bc70 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1bc80 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1bc90 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1bca0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1bcb0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1bcc0 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1bcd0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1bce0 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1bcf0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1bd00 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1bd10 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1bd20 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1bd30 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1bd40 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1bd50 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1bd60 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1bd70 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1bd80 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1bd90 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1bda0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1bdb0 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1bdc0 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1bdd0 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1bde0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1bdf0 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1be00 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1be10 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1be20 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1be30 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1be40 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1be50 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1be60 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1be70 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1be80 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1be90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1bea0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1beb0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1bec0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1bed0 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1bee0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1bef0 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1bf00 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
1bf10 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1bf20 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1bf30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1bf40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bf50 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1bf60 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1bf70 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1bf80 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1bf90 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1bfa0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1bfb0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1bfc0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1bfd0 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1bfe0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1bff0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1c000 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1c010 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1c020 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1c030 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1c040 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1c050 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1c060 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1c070 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1c080 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1c090 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1c0a0 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1c0b0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1c0c0 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1c0d0 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1c0e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c0f0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1c100 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1c110 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1c120 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1c130 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1c140 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1c150 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1c160 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1c170 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1c180 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1c190 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1c1a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1c1b0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1c1c0 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1c1d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1c1e0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1c1f0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1c200 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1c210 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1c220 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1c230 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1c240 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1c250 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1c260 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1c270 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1c280 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1c290 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1c2a0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1c2b0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1c2c0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1c2d0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1c2e0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1c2f0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1c300 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1c310 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1c320 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1c330 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1c340 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1c350 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1c360 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1c370 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1c380 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1c390 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1c3a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1c3b0 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1c3c0 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1c3d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c3e0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1c3f0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1c400 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1c410 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1c420 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1c430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1c440 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1c450 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1c460 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1c470 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1c480 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1c490 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1c4a0 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1c4b0 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1c4c0 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1c4d0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1c4e0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1c4f0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1c500 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c510 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1c520 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1c530 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1c540 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c560 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1c570 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1c580 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1c590 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1c5a0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1c5b0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1c5c0 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1c5d0 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1c5e0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1c5f0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1c600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c610 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1c620 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1c630 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1c640 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1c650 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1c660 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c670 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1c680 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1c690 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1c6a0 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1c6b0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1c6c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c6d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1c6e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1c6f0 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1c700 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c710 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1c720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c730 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1c740 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1c750 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1c760 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1c770 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1c780 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1c790 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1c7a0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1c7b0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1c7c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1c7d0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1c7e0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1c7f0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1c800 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1c810 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1c820 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1c830 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1c840 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1c850 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1c860 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1c870 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
1c880 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1c890 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1c8a0 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1c8b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1c8c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1c8d0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1c8e0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1c8f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1c900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c910 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c920 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c930 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1c940 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1c950 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1c960 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c970 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1c980 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1c990 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
1c9a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c9b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1c9c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c9d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1c9e0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1c9f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1ca00 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1ca10 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1ca20 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1ca30 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1ca40 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
1ca50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ca60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1ca70 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1ca80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1ca90 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1caa0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1cab0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1cac0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1cad0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1cae0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1caf0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1cb00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1cb10 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1cb20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1cb30 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1cb40 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1cb50 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1cb60 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1cb70 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1cb80 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1cb90 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1cba0 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1cbb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1cbc0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1cbd0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1cbe0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1cbf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1cc00 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1cc10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1cc20 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1cc30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cc40 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1cc50 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1cc60 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1cc70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1cc80 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1cc90 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1cca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ccb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ccc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ccd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1cce0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1ccf0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1cd00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1cd10 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1cd20 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1cd30 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1cd40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1cd50 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1cd60 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1cd70 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1cd80 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1cd90 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
1cda0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1cdb0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1cdc0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1cdd0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1cde0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1cdf0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1ce00 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1ce10 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1ce20 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1ce30 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1ce40 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1ce50 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1ce60 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1ce70 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1ce80 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1ce90 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1cea0 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1ceb0 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1cec0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1ced0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1cee0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1cef0 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1cf00 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1cf10 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1cf20 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1cf30 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1cf40 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1cf50 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1cf60 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1cf70 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1cf80 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1cf90 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1cfa0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1cfb0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1cfc0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1cfd0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1cfe0 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1cff0 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1d000 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1d010 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1d020 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1d030 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1d040 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1d050 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1d060 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1d070 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1d080 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1d090 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1d0a0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1d0b0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1d0c0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1d0d0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1d0e0 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1d0f0 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1d100 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1d110 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1d120 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1d130 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1d140 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1d150 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1d160 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1d170 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1d180 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1d190 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1d1a0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1d1b0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1d1c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1d1d0 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1d1e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1d1f0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1d200 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1d210 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1d220 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1d230 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1d240 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1d250 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1d260 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1d270 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d280 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1d290 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1d2a0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1d2b0 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1d2c0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1d2d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1d2e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1d2f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d300 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1d310 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d320 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1d330 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1d340 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1d350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1d360 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1d370 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1d380 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1d390 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1d3a0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1d3b0 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1d3c0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1d3d0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1d3e0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1d3f0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1d400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1d410 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
1d420 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1d430 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1d440 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1d450 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1d460 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1d470 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1d480 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1d490 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1d4a0 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1d4b0 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1d4c0 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1d4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1d4e0 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1d4f0 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1d500 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1d510 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1d520 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1d530 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1d540 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1d550 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1d560 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1d570 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1d580 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1d590 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1d5a0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1d5b0 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1d5c0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1d5d0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1d5e0 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1d5f0 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1d600 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1d610 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1d620 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1d630 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
1d640 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
1d650 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
1d660 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
1d670 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
1d680 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
1d690 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
1d6a0 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
1d6b0 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
1d6c0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1d6d0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1d6e0 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
1d6f0 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
1d700 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
1d710 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1d720 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
1d730 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
1d740 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
1d750 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
1d760 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
1d770 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1d780 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1d790 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1d7a0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1d7b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
1d7c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1d7d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1d7e0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1d7f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d800 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1d810 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1d820 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1d830 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
1d840 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73  return 0;.}.cons
1d850 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1d860 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
1d870 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1d880 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
1d890 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d8a0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1d8b0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1d8c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1d8d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1d8e0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1d8f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1d900 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1d910 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1d920 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1d930 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
1d940 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1d950 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
1d960 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1d970 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
1d980 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
1d990 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1d9a0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
1d9b0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
1d9c0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
1d9d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1d9e0 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
1d9f0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
1da00 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
1da10 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
1da20 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
1da30 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
1da40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1da50 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
1da60 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1da70 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1da80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1da90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1daa0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1dab0 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
1dac0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
1dad0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
1dae0 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
1daf0 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
1db00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1db10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1db20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
1db30 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
1db40 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
1db50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1db60 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
1db70 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
1db80 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
1db90 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
1dba0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
1dbb0 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
1dbc0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
1dbd0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1dbe0 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
1dbf0 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20  ->nCell<1 ){.   
1dc00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1dc10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1dc20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1dc30 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
1dc40 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  NDEBUG./*.** Pag
1dc50 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
1dc60 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
1dc70 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
1dc80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
1dc90 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
1dca0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
1dcb0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
1dcc0 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
1dcd0 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
1dce0 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
1dcf0 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
1dd00 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
1dd10 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
1dd20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
1dd30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
1dd40 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
1dd50 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
1dd60 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1dd70 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
1dd80 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
1dd90 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
1dda0 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
1ddb0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  {.  assert( iIdx
1ddc0 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
1ddd0 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
1dde0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1ddf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
1de00 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
1de10 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
1de20 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
1de30 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
1de40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
1de50 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1de60 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
1de70 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
1de80 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
1de90 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
1dea0 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
1deb0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
1dec0 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
1ded0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
1dee0 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
1def0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
1df00 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
1df10 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
1df20 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
1df30 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
1df40 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
1df50 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
1df60 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
1df70 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
1df80 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
1df90 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
1dfa0 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
1dfb0 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76  cell index..*/.v
1dfc0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1dfd0 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  MoveToParent(BtC
1dfe0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1dff0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1e000 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1e010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1e020 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1e030 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1e040 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1e050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1e060 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e070 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
1e080 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
1e090 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
1e0a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
1e0b0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
1e0c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
1e0d0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
1e0e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e0f0 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72  ]->pgno.  );.  r
1e100 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
1e110 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1e120 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
1e130 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
1e140 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1e150 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1e160 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 0;.}../*.** 
1e170 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1e180 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
1e190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1e1a0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
1e1b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
1e1c0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
1e1d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e1e0 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
1e1f0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1e200 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e210 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
1e220 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1e230 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1e240 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
1e250 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
1e260 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1e270 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
1e280 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
1e290 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1e2a0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1e2b0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
1e2c0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1e2d0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1e2e0 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
1e2f0 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
1e300 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1e310 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
1e320 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
1e330 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
1e340 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1e350 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
1e360 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
1e370 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
1e380 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1e390 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=1; i<=pCur->
1e3a0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1e3b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e3c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1e3d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1e3e0 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53      if( .      S
1e3f0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
1e400 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
1e410 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
1e420 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
1e430 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20  e[0])).    ){.  
1e440 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1e450 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1e460 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
1e470 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
1e480 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
1e490 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
1e4a0 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
1e4b0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1e4c0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
1e4d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69   = 0;.  pCur->ai
1e4e0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
1e4f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1e500 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
1e510 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
1e520 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
1e530 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
1e540 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
1e550 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1e560 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
1e570 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
1e580 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
1e590 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e5a0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1e5b0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
1e5c0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
1e5d0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
1e5e0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
1e5f0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
1e600 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
1e610 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1e620 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
1e630 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
1e640 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
1e650 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
1e660 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1e670 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
1e680 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
1e690 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
1e6a0 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
1e6b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
1e6c0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1e6d0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
1e6e0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1e6f0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
1e700 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
1e710 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1e720 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
1e730 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1e740 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1e750 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
1e760 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
1e770 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1e780 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1e790 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
1e7a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e7b0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1e7c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e7d0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
1e7e0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1e7f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e800 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e810 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e820 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e830 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1e840 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1e850 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1e860 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e870 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
1e880 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1e890 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e8a0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1e8b0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1e8c0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1e8d0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
1e8e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
1e8f0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1e900 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1e910 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e920 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1e930 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1e940 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
1e950 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1e960 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
1e970 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
1e980 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1e990 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
1e9a0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
1e9b0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
1e9c0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
1e9d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
1e9e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1e9f0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
1ea00 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
1ea10 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
1ea20 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
1ea30 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
1ea40 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
1ea50 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1ea60 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
1ea70 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
1ea80 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
1ea90 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
1eaa0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
1eab0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
1eac0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1ead0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1eae0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
1eaf0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1eb00 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1eb10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1eb20 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1eb30 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
1eb40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1eb50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1eb60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1eb70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1eb80 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
1eb90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1eba0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
1ebb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1ebc0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
1ebd0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1ebe0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ebf0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ec00 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
1ec10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1ec20 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
1ec30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1ec40 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1ec50 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
1ec60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ec70 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1ec80 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
1ec90 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
1eca0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1ecb0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1ecc0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1ecd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ece0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1ecf0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
1ed00 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
1ed10 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1ed20 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1ed30 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1ed40 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1ed50 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1ed60 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1ed70 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1ed80 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1ed90 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1eda0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1edb0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
1edc0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1edd0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1ede0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1edf0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1ee00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1ee10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ee20 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1ee30 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1ee40 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1ee50 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1ee60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ee70 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1ee80 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1ee90 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
1eea0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1eeb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1eec0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1eed0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1eee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1eef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ef00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ef10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ef20 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
1ef30 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1ef40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1ef50 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1ef60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1ef70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1ef80 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1ef90 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1efa0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1efb0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1efc0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1efd0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1efe0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1eff0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1f000 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1f010 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1f020 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1f030 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1f040 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1f050 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f060 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1f070 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
1f080 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f090 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1f0a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f0b0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1f0c0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1f0d0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
1f0e0 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
1f0f0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
1f100 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
1f110 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
1f120 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
1f130 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1f140 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  && pCur->atLast 
1f150 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1f160 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
1f170 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
1f180 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
1f190 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
1f1a0 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
1f1b0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
1f1c0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
1f1d0 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
1f1e0 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
1f1f0 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
1f200 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
1f210 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f220 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
1f230 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
1f240 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
1f250 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1f260 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
1f270 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
1f280 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1f290 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
1f2a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1f2b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
1f2c0 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
1f2d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f2e0 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
1f2f0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1f300 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1f320 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1f330 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1f340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1f350 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1f360 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1f370 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1f380 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1f390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f3a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f3b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1f3c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1f3d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
1f3e0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1f3f0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
1f400 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
1f410 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
1f420 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f430 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1f440 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
1f450 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
1f460 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
1f470 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
1f480 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
1f490 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
1f4a0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1f4b0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1f4c0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
1f4d0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
1f4e0 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
1f4f0 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
1f500 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
1f510 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
1f520 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
1f530 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
1f540 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
1f550 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
1f560 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
1f570 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
1f580 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1f590 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
1f5a0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
1f5b0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
1f5c0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
1f5d0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
1f5e0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
1f5f0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
1f600 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
1f610 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1f620 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
1f630 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
1f640 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
1f650 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
1f660 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1f670 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1f680 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
1f690 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
1f6a0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1f6b0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
1f6c0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
1f6d0 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
1f6e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
1f6f0 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
1f700 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1f710 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1f720 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1f730 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
1f740 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
1f750 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
1f760 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1f770 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1f780 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
1f790 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
1f7a0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
1f7b0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
1f7c0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
1f7d0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1f7e0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1f7f0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
1f820 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
1f830 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1f840 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
1f850 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1f860 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1f870 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1f880 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
1f890 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
1f8a0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
1f8b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1f8c0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
1f8d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f8f0 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
1f900 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
1f910 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
1f920 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1f930 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
1f940 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
1f950 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
1f960 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
1f970 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
1f980 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1f990 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
1f9a0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
1f9b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f9d0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
1f9e0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1f9f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1fa00 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1fa10 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1fa20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fa30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1fa40 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1fa50 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
1fa60 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1fa70 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
1fa80 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
1fa90 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
1faa0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
1fab0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1fac0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1fad0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
1fae0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1faf0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
1fb00 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
1fb10 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
1fb20 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
1fb30 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1fb40 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
1fb50 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1fb60 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1fb70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fb80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1fb90 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1fba0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
1fbb0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1fbc0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
1fbd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fbe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
1fbf0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1fc00 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
1fc10 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1fc20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1fc30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1fc40 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1fc50 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1fc60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1fc70 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1fc80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1fc90 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1fca0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1fcb0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1fcc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1fcd0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1fce0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1fcf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1fd00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1fd10 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
1fd20 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
1fd30 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1fd40 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
1fd50 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
1fd60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1fd70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fd80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
1fd90 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
1fda0 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
1fdb0 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
1fdc0 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
1fdd0 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
1fde0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1fdf0 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  ;.    if( (!pPag
1fe00 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64  e->intKey && pId
1fe10 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c  xKey==0) || upr<
1fe20 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1fe30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1fe40 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1fe50 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1fe60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61     }.    if( bia
1fe70 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  sRight ){.      
1fe80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1fe90 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1fea0 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1feb0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1fec0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1fed0 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29   (u16)((upr+lwr)
1fee0 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  /2);.    }.    f
1fef0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e  or(;;){.      in
1ff00 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
1ff10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1ff20 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75  ; /* Index of cu
1ff30 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
1ff40 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  age */.      u8 
1ff50 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
1ff80 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
1ff90 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70  Page */..      p
1ffa0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ffb0 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  = 0;.      pCell
1ffc0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1ffd0 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
1ffe0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
1fff0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
20000 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
20010 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
20020 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
20030 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
20040 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
20050 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
20060 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
20070 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
20080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20090 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
200a0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
200b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
200c0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
200d0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
200e0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
200f0 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
20100 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
20110 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
20120 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20130 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20140 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
20150 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
20160 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
20170 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
20180 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
20190 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
201a0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
201b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
201c0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
201d0 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
201e0 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38 20  e-size is 32768 
201f0 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
20200 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
20210 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
20220 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
20230 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
20240 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
20250 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
20260 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20 62  s at most 8198 b
20270 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ytes, which may 
20280 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
20290 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
202a0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
202b0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
202c0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
202d0 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
202e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
202f0 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
20300 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
20310 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
20320 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
20330 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
20340 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
20350 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
20360 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
20370 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
20380 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
20390 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
203a0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
203b0 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
203c0 20 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c       if( !(nCell
203d0 20 26 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c   & 0x80) && nCel
203e0 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  l<=pPage->maxLoc
203f0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
20400 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
20410 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
20420 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
20430 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
20440 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
20450 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
20460 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
20470 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
20480 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
20490 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
204a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
204b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
204c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
204d0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
204e0 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
204f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
20500 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
20510 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
20520 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
20530 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
20540 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
20550 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
20560 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
20570 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
20580 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
20590 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
205a0 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
205b0 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
205c0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
205d0 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
205e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  */.          c =
205f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20600 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
20610 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
20620 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
20630 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20640 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
20650 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
20660 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
20670 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
20680 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
20690 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
206a0 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
206b0 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
206c0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
206d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
206e0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
206f0 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
20700 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
20710 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
20720 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
20730 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
20740 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
20750 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
20760 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
20770 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
20780 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
20790 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
207a0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
207b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
207c0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
207d0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
207e0 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
207f0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
20800 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
20810 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
20820 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
20830 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
20840 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
20850 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
20860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20870 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
20880 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
20890 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
208a0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
208b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
208c0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
208d0 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
208e0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
208f0 6c 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lKey, 0, 0);.   
20900 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
20910 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20920 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
20930 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
20940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20950 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
20960 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
20970 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f  c ) goto moveto_
20980 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
20990 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
209a0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
209b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
209c0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
209d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
209e0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
209f0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
20a00 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
20a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
20a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20a30 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
20a40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20a50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
20a60 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
20a70 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
20a80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20a90 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
20aa0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
20ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20ac0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
20ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20ae0 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20  lwr>upr ){.     
20af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20b00 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  }.      pCur->ai
20b10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20b20 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70   = (u16)((lwr+up
20b30 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
20b40 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
20b50 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
20b60 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
20b70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
20b80 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
20b90 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
20ba0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
20bb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
20bc0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
20bd0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
20be0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
20bf0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
20c00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
20c10 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
20c20 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
20c30 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
20c40 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
20c50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20c60 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20c70 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
20c80 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20c90 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
20ca0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
20cb0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
20cc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20cd0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
20ce0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
20cf0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
20d00 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
20d10 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
20d20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
20d30 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
20d40 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
20d50 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
20d60 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
20d70 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
20d80 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
20d90 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
20da0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
20db0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
20dc0 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
20dd0 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
20de0 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
20df0 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
20e00 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
20e10 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
20e20 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
20e30 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
20e40 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
20e50 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
20e60 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
20e70 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ork..*/.int sqli
20e80 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a  te3BtreeMoveto(.
20e90 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
20ea0 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
20eb0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
20ec0 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
20ed0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
20ee0 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
20ef0 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
20f00 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
20f10 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
20f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
20f30 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
20f40 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
20f50 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
20f60 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
20f70 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
20f80 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
20f90 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
20fa0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
20fb0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
20fc0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
20fd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ff0 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
21000 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
21010 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
21020 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
21030 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61   key */.  char a
21040 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20  Space[150];     
21050 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61       /* Temp spa
21060 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d  ce for pIdxKey -
21070 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c   to avoid a mall
21080 6f 63 20 2a 2f 0a 0a 0a 20 20 69 66 28 20 70 4b  oc */...  if( pK
21090 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
210a0 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
210b0 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
210c0 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
210d0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
210e0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
210f0 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
21100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
21130 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
21140 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
21150 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
21160 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
21170 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
21180 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
21190 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
211a0 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
211b0 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
211c0 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
211d0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  ( pKey ){.    sq
211e0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
211f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49  npackedRecord(pI
21200 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  dxKey);.  }.  re
21210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
21220 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
21230 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
21240 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
21250 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
21260 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
21270 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
21280 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
21290 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
212a0 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
212b0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
212c0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
212d0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
212e0 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
212f0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
21300 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
21310 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
21320 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
21330 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21340 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
21350 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
21360 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
21370 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
21380 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
21390 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
213a0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
213b0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
213c0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
213d0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
213e0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
213f0 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
21400 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
21410 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
21420 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
21430 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
21440 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
21450 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
21460 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
21470 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
21480 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
21490 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
214a0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
214b0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
214c0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
214d0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
214e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
214f0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
21500 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
21510 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
21520 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
21530 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
21540 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
21550 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
21560 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
21570 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
21580 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
21590 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
215a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
215b0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
215c0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
215d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
215e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
215f0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
21600 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
21610 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
21620 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
21630 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
21640 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
21650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21660 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
21670 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
21680 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
21690 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
216a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
216b0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
216c0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
216d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
216e0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
216f0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
21700 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
21710 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
21720 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
21730 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
21740 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
21750 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
21760 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
21770 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
21780 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
21790 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
217a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
217b0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
217c0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
217d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
217e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
217f0 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
21800 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
21810 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
21820 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
21830 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
21840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
21850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
21860 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
21870 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
21880 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
21890 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
218a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
218b0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
218c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
218d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
218e0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
218f0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
21900 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
21910 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21920 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
21930 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
21940 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
21950 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
21960 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
21970 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
21980 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
21990 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
219a0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
219b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
219c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
219d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
219e0 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
219f0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
21a00 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
21a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21a20 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
21a30 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
21a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21a50 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
21a60 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
21a70 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
21a80 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
21a90 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
21aa0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
21ab0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
21ac0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
21ad0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
21ae0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
21af0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21b00 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
21b10 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
21b20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
21b30 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
21b40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21b50 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
21b60 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
21b70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
21b80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21b90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
21ba0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21bb0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
21bc0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
21bd0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
21be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21bf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
21c00 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
21c10 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
21c20 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
21c30 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
21c40 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
21c50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21c60 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
21c70 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20  ur->skip<0 ){.  
21c80 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
21c90 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
21ca0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21cb0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
21cc0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
21cd0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
21ce0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21cf0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
21d00 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
21d10 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
21d20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
21d30 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
21d40 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
21d50 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
21d60 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
21d70 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
21d80 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
21d90 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
21da0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
21db0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
21dc0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
21dd0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
21de0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21df0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
21e00 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
21e10 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
21e20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
21e30 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
21e40 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
21e50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
21e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21e80 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
21e90 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
21ea0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
21eb0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
21ec0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
21ed0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
21ee0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21ef0 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
21f00 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
21f10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
21f20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
21f30 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
21f40 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
21f50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
21f60 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
21f70 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
21f80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21f90 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
21fa0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
21fb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21fc0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
21fd0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
21fe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21ff0 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
22000 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
22010 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
22020 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
22030 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
22040 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
22050 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
22060 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
22070 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
22080 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
22090 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
220a0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
220b0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
220c0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
220d0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
220e0 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
220f0 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
22100 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22110 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
22120 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
22130 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
22140 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
22150 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
22160 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
22170 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
22180 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
22190 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
221a0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
221b0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
221c0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
221d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
221e0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
221f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
22200 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
22210 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
22220 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
22230 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
22240 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
22250 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
22260 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
22270 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
22280 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
22290 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
222a0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
222b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
222c0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
222d0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
222e0 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
222f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
22300 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
22310 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
22320 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
22330 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
22340 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
22350 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
22360 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
22370 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
22380 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
22390 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
223a0 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
223b0 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
223c0 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
223d0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
223e0 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
223f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
22400 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
22410 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
22420 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
22430 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
22440 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
22450 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
22460 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
22470 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
22480 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
22490 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
224a0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
224b0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
224c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
224d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
224e0 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
224f0 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
22500 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
22510 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
22520 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
22530 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
22540 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22550 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
22560 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
22570 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
22580 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61 67 65  .  mxPage = page
22590 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
225a0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
225b0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
225c0 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 6d 78 50  6]);.  if( n>mxP
225d0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
225e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
225f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
22600 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
22610 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
22620 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
22630 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
22640 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
22650 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
22660 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
22670 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
22680 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
22690 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
226a0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
226b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
226c0 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
226d0 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
226e0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
226f0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
22700 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
22710 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
22720 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
22730 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
22740 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
22750 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
22760 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
22770 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
22780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22790 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
227a0 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
227b0 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
227c0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
227d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
227e0 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
227f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
22800 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
22810 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
22820 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
22830 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
22840 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
22850 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
22860 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
22870 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
22880 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
22890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
228a0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
228b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
228c0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
228d0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
228e0 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
228f0 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
22900 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
22910 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
22920 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
22930 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
22940 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
22950 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22960 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
22970 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
22980 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
22990 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
229a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
229b0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
229c0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
229d0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
229e0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
229f0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
22a00 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
22a10 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
22a20 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
22a30 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
22a40 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
22a50 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
22a60 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
22a70 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
22a80 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
22a90 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
22aa0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
22ab0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
22ac0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
22ad0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
22ae0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
22af0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
22b00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
22b10 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
22b20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
22b30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
22b40 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
22b50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
22b60 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22b70 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
22b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
22b90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
22ba0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
22bb0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
22bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22bd0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
22be0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
22bf0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
22c00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
22c10 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
22c20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
22c30 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
22c40 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
22c50 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
22c60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
22c70 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
22c80 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
22c90 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
22ca0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
22cb0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
22cc0 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
22cd0 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
22ce0 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
22cf0 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
22d00 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
22d10 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
22d20 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
22d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22d40 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
22d50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
22d60 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22d70 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
22d80 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
22d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22da0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
22db0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
22dc0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
22dd0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
22de0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
22df0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
22e00 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
22e10 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
22e20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
22e30 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
22e40 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
22e50 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
22e60 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
22e70 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
22e80 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
22e90 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
22ea0 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
22eb0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
22ec0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
22ed0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
22ee0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
22ef0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
22f00 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
22f10 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
22f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
22f30 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
22f40 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
22f50 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
22f60 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
22f70 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
22f80 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
22f90 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
22fa0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
22fb0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
22fc0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
22fd0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
22fe0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
22ff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
23000 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
23010 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
23020 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
23030 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
23040 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
23050 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23060 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
23070 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
23080 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
23090 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
230a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
230b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
230c0 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
230d0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
230e0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
230f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
23100 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
23110 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
23120 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
23130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23140 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
23150 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
23160 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
23170 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
23180 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
23190 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
231a0 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
231b0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
231c0 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
231d0 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
231e0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
231f0 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
23200 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
23210 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
23220 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
23230 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
23240 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
23250 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
23260 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
23270 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
23280 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
23290 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
232a0 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
232b0 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d   if( iNewTrunk>m
232c0 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20  xPage ){ .      
232d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
232e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
232f0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
23300 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
23310 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
23320 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
23330 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
23340 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
23350 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
23360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
23390 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
233a0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
233b0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
233c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
233d0 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
233e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
233f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23410 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
23420 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
23430 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
23440 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
23450 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23460 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
23470 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
23480 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
23490 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
234a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
234b0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
234c0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
234d0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
234e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
234f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
23500 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
23510 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
23520 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
23530 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
23540 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
23550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23560 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
23570 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
23580 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
23590 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
235a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
235b0 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
235c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
235d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
235e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
235f0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
23600 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
23610 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
23620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
23630 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
23640 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
23650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23660 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
23670 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
23680 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
23690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
236a0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
236b0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
236c0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
236d0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
236e0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
236f0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
23700 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
23710 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
23720 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
23730 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
23740 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
23750 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
23760 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
23770 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
23780 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
23790 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
237a0 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
237b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
237c0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
237d0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
237e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
237f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
23800 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
23810 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
23820 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
23830 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
23840 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
23850 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
23860 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23870 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
23880 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
23890 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
238a0 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
238b0 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
238c0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
238d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
238e0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
238f0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
23900 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
23910 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
23920 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
23930 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23940 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
23950 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
23960 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
23970 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
23980 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
239a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
239b0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
239c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
239d0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
239e0 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
239f0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
23a00 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
23a10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
23a20 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
23a30 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
23a40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
23a50 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
23a60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
23a70 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
23a80 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
23a90 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
23aa0 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
23ab0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a      Pgno nPage;.
23ac0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
23ad0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
23ae0 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65      nPage = page
23af0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
23b00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
23b10 50 61 67 65 3e 6e 50 61 67 65 20 29 7b 0a 20 20  Page>nPage ){.  
23b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
23b30 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20 65  e page off the e
23b40 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
23b50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
23b60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
23b70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
23b80 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
23b90 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
23ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23bb0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
23bc0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
23bd0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
23be0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
23bf0 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
23c00 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
23c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
23c30 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
23c40 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
23c50 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
23c60 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
23c70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
23c80 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
23c90 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
23ca0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
23cb0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
23cc0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
23cd0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -1);.          a
23ce0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
23cf0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
23d00 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20  Trunk->pDbPage) 
23d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
23d20 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
23d30 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
23d40 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20  , *pPgno);.     
23d50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23d60 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
23d70 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
23d80 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
23d90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23db0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
23dc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23dd0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
23de0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
23df0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23e10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
23e20 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
23e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
23e50 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
23e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23e70 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
23e80 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
23e90 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
23ea0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
23eb0 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
23ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
23ed0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
23ee0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
23ef0 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
23f00 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
23f10 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
23f20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  e file */.    in
23f30 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50  t nPage = pagerP
23f40 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
23f50 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67     *pPgno = nPag
23f60 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20  e + 1;..    if( 
23f70 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
23f80 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
23f90 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  {.      (*pPgno)
23fa0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ++;.    }..#ifnd
23fb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23fc0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
23fd0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
23fe0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
23ff0 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20  GE(pBt, *pPgno) 
24000 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
24010 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
24020 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
24030 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
24040 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
24050 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
24060 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
24070 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
24080 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
24090 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
240a0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
240b0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
240c0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
240d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
240e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
240f0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
24100 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
24110 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
24120 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
24130 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
24140 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
24150 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
24160 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
24170 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
24180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
24190 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
241a0 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20 30   *pPgno, &pPg, 0
241b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
241c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
241d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
241e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
241f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
24200 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
24210 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
24220 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
24230 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28 2a  urn rc;.      (*
24240 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20  pPgno)++;.      
24250 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
24260 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
24270 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b  t) ){ (*pPgno)++
24280 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
24290 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
242a0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
242b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
242c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
242d0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
242e0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
242f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24300 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24320 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
24330 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
24340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
24360 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
24370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
24380 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
24390 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
243a0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
243b0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
243c0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
243d0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
243e0 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
243f0 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
24400 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
24410 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
24420 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
24430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24440 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
24450 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
24460 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
24470 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
24480 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
24490 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
244a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
244b0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
244c0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
244d0 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
244e0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
244f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24500 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
24510 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24520 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
24530 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
24540 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
24550 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
24560 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
24570 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
24580 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
24590 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
245a0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
245b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
245c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
245d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
245e0 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
245f0 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
24600 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
24610 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
24620 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
24630 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
24640 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
24650 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
24660 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
24670 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
24680 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
24690 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
246a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
246b0 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
246c0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
246d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
246e0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
246f0 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
24700 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
24710 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
24720 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
24730 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
24740 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
24750 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
24760 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
24770 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24780 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
24790 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
247a0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
247d0 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
247e0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
247f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
24800 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
24810 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
24820 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
24830 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
24840 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
24850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24860 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
24870 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
24880 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
248b0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
248c0 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
248e0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
248f0 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
24900 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
24910 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
24920 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
24930 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
24940 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
24950 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
24960 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
24970 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
24980 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
24990 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
249a0 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
249b0 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
249c0 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
249d0 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
249e0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
249f0 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
24a00 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
24a10 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
24a20 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
24a30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24a40 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
24a50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
24a60 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
24a70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
24a80 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
24a90 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
24aa0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
24ab0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
24ac0 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65  nFree+1);..#ifde
24ad0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
24ae0 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
24af0 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
24b00 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
24b10 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
24b20 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
24b30 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
24b40 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
24b50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
24b60 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
24b70 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
24b80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
24b90 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
24ba0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
24bb0 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20  ).   ||         
24bc0 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33     (rc = sqlite3
24bd0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
24be0 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 29 7b  ->pDbPage)).  ){
24bf0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
24c00 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d 65  ge_out;.  }.  me
24c10 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
24c20 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
24c30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e  ->pageSize);.#en
24c40 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
24c50 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
24c60 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
24c70 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
24c80 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
24c90 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
24ca0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
24cb0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
24cc0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
24cd0 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  M ){.    rc = pt
24ce0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
24cf0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
24d00 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
24d10 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
24d20 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
24d30 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
24d40 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
24d50 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
24d60 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
24d70 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
24d80 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
24d90 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
24da0 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
24db0 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
24dc0 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
24dd0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
24de0 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
24df0 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
24e00 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
24e10 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
24e20 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
24e30 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
24e40 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
24e50 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
24e60 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
24e70 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
24e80 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
24e90 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
24ea0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
24eb0 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
24ec0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
24ed0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
24ee0 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
24ef0 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
24f00 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
24f10 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
24f20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
24f30 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
24f40 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
24f50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
24f60 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
24f70 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
24f80 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
24f90 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
24fa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24fb0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
24fc0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
24fd0 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
24fe0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
24ff0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
25000 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b 0a 20  if( nLeaf<0 ){. 
25010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25020 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25030 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
25040 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
25050 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42 74 2d    if( nLeaf<pBt-
25060 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
25070 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
25080 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
25090 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
250a0 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
250b0 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
250c0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
250d0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
250e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
250f0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
25100 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
25110 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
25120 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
25130 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
25140 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
25150 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
25160 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
25170 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
25180 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
25190 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
251a0 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
251b0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
251c0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
251d0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
251e0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
251f0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
25200 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
25210 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
25220 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
25230 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
25240 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
25250 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
25260 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
25270 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
25280 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
25290 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
252a0 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
252b0 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65  ll contain to re
252c0 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
252d0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
252e0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
252f0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
25300 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
25310 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
25320 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
25330 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
25340 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
25350 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
25360 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
25370 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
25380 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
25390 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
253a0 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
253b0 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
253c0 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  /4-8"..      */.
253d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
253e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
253f0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
25400 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25420 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
25430 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
25440 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
25450 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
25460 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
25470 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e  4], iPage);.#ifn
25480 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
25490 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
254a0 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
254b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
254c0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
254d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
254e0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
254f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
25500 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
25510 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  pBt, iPage);.   
25520 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
25530 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
25540 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
25550 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
25560 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
25570 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  no));.      goto
25580 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
25590 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
255a0 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
255b0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
255c0 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70  hen it was not p
255d0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
255e0 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  he.  ** the page
255f0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
25600 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74  a leaf page of t
25610 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  he first trunk i
25620 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
25630 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62  .  ** Possibly b
25640 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d  ecause the free-
25650 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f  list is empty, o
25660 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75  r possibly becau
25670 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72  se the .  ** fir
25680 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
25690 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
256a0 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  l. Either way, t
256b0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
256c0 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  eed.  ** will be
256d0 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72  come the new fir
256e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
256f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
25700 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28 28 21    */.  if(   ((!
25710 70 50 61 67 65 29 20 26 26 20 28 30 20 21 3d 20  pPage) && (0 != 
25720 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
25730 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
25740 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
25750 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30 20 21  ))).     || (0 !
25760 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  = (rc = sqlite3P
25770 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
25780 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20 29 7b  >pDbPage))).  ){
25790 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
257a0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
257b0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
257c0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
257d0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
257e0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
257f0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
25800 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
25810 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
25820 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
25830 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
25840 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
25850 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
25860 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
25870 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
25880 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
25890 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
258a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
258b0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
258c0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
258d0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
258e0 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65   int freePage(Me
258f0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
25900 20 72 65 74 75 72 6e 20 66 72 65 65 50 61 67 65   return freePage
25910 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
25920 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
25930 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
25940 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
25950 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
25960 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
25970 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
25980 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
25990 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
259a0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
259b0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
259c0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
259d0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
259e0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
259f0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
25a00 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20  nt nOvfl;.  u16 
25a10 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
25a20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25a30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
25a40 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
25a50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
25a60 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
25a70 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
25a80 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
25a90 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
25aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25ab0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
25ac0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
25ad0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
25ae0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
25af0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
25b00 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
25b10 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
25b20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
25b30 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
25b40 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
25b50 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
25b60 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
25b70 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
25b80 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
25b90 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
25ba0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
25bb0 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
25bc0 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
25bd0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
25be0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
25bf0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
25c00 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
25c10 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
25c20 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
25c30 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
25c40 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
25c50 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
25c60 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
25c70 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
25c80 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
25c90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
25ca0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
25cb0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
25cc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
25cd0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
25ce0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
25cf0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
25d00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25d10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25d20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
25d30 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
25d40 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
25d50 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
25d60 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
25d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
25d80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
25d90 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65   }.    rc = free
25da0 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
25db0 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
25dc0 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
25dd0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
25de0 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
25df0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
25e00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
25e10 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
25e20 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
25e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25e40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
25e50 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
25e60 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
25e70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
25e80 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
25e90 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
25ea0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
25eb0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
25ec0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
25ed0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
25ee0 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
25ef0 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
25f00 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
25f10 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
25f20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
25f30 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
25f40 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
25f50 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
25f60 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
25f70 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
25f80 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
25f90 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
25fa0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
25fb0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
25fc0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
25fd0 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
25fe0 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
25ff0 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
26000 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
26010 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
26020 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
26030 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
26040 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
26050 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
26060 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26080 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
26090 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
260a0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
260b0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
260c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
260d0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
260e0 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
260f0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
26100 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
26110 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
26120 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
26130 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
26140 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
26150 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
26160 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
26170 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
26180 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
26190 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261b0 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
261c0 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
261d0 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
261e0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
261f0 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
26200 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
26210 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
26220 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
26230 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
26240 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
26250 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
26260 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
26270 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
26280 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
26290 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
262a0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
262b0 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
262c0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
262d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
262e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
262f0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
26300 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
26310 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
26320 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
26330 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
26340 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
26350 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
26360 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
26370 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
26380 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
26390 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
263a0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
263b0 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
263c0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
263d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
263e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
263f0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
26400 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
26410 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
26420 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
26430 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61   = 0;.  if( !pPa
26440 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
26450 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20  nHeader += 4;.  
26460 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  }.  if( pPage->h
26470 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48  asData ){.    nH
26480 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
26490 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
264a0 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
264b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
264c0 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
264d0 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
264e0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
264f0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
26500 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73  u64*)&nKey);.  s
26510 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
26520 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
26530 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
26540 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
26550 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
26560 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
26570 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
26580 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
26590 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
265a0 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
265b0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
265c0 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
265d0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
265e0 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
265f0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
26600 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
26610 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
26620 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
26630 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
26640 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66   nKey>0x7fffffff
26650 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   || pKey==0 ){. 
26660 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26670 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
26680 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
26690 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
266a0 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
266b0 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
266c0 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
266d0 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
266e0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
266f0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
26700 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
26710 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
26720 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
26730 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
26740 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
26750 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
26760 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
26770 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26780 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
26790 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
267a0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
267b0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
267c0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
267d0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
267e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
267f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
26800 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
26810 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
26820 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
26830 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
26840 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
26850 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
26860 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26870 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
26880 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
26890 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
268a0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
268b0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
268c0 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
268d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
268e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
268f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
26900 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
26910 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
26920 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
26930 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
26940 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
26950 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
26960 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
26970 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
26980 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
26990 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
269a0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
269b0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
269c0 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
269d0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
269e0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
269f0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
26a00 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
26a10 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
26a20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
26a30 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
26a40 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
26a50 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
26a60 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
26a70 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
26a80 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
26a90 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
26aa0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
26ab0 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
26ac0 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
26ad0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
26ae0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
26af0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26b00 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
26b10 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
26b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26b30 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
26b40 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
26b50 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
26b60 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
26b70 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
26b80 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
26b90 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
26ba0 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
26bb0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
26bc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
26bd0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
26be0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
26bf0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
26c00 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
26c10 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
26c20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
26c30 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
26c40 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
26c50 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
26c60 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
26c70 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
26c80 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
26c90 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
26ca0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
26cb0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
26cc0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
26cd0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
26ce0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
26cf0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
26d00 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
26d10 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
26d20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
26d30 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
26d40 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
26d50 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
26d60 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
26d70 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
26d80 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26d90 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
26da0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
26db0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
26dc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
26dd0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
26de0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26df0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
26e00 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
26e10 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
26e20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
26e30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
26e40 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
26e50 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
26e60 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
26e70 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
26e80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
26e90 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
26ea0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
26eb0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
26ec0 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
26ed0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
26ee0 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
26ef0 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
26f00 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
26f10 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
26f20 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
26f30 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
26f40 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
26f50 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
26f60 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
26f70 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
26f80 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
26f90 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
26fa0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
26fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
26fc0 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
26fd0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26fe0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
26ff0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
27000 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
27010 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
27020 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
27030 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
27040 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
27050 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
27060 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
27070 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
27080 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
27090 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
270a0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
270b0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
270c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
270d0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
270e0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
270f0 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
27100 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
27110 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
27120 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
27130 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
27140 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
27150 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27160 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
27170 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
27180 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
27190 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
271a0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
271b0 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
271c0 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
271d0 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
271e0 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
271f0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
27200 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
27210 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
27220 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
27230 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
27240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27250 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
27260 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
27270 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
27280 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
27290 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
272a0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
272b0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
272c0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
272d0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
272e0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
272f0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
27300 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
27310 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
27320 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
27330 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
27340 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
27350 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
27360 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
27370 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
27380 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
27390 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65 6c  atic int dropCel
273a0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
273b0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
273c0 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
273d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
273e0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
273f0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
27400 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
27410 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
27420 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
27430 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
27440 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
27450 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
27460 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
27470 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
27480 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
27490 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
274a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
274b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
274c0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
274d0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
274e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
274f0 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
27500 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
27510 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
27520 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
27530 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
27540 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27550 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
27560 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
27570 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
27580 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
27590 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
275a0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
275b0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
275c0 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20 28  te(ptr);.  if( (
275d0 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  pc<pPage->hdrOff
275e0 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
275f0 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c  af?0:4)).     ||
27600 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70   (pc+sz>pPage->p
27610 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
27620 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27630 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27640 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  T;.  }.  rc = fr
27650 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
27660 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
27670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27680 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
27690 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  }.  for(i=idx+1;
276a0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
276b0 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
276c0 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
276d0 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
276e0 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
276f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
27700 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
27710 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
27720 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
27730 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
27740 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72  ee += 2;.  retur
27750 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27760 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
27770 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
27780 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
27790 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
277a0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
277b0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
277c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
277d0 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
277e0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
277f0 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
27800 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
27810 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
27820 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
27830 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
27840 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
27850 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
27860 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
27870 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
27880 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
27890 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
278a0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
278b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
278c0 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
278d0 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
278e0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
278f0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
27900 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
27910 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
27920 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
27930 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
27940 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
27950 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
27960 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
27970 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
27980 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
27990 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
279a0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
279b0 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
279c0 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
279d0 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
279e0 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
279f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
27a00 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
27a10 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
27a20 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
27a30 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
27a40 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
27a50 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
27a60 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
27a70 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
27a80 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
27a90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27aa0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
27ab0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
27ac0 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
27ad0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
27ae0 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
27af0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
27b00 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
27b10 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
27b20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
27b30 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
27b40 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
27b50 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
27b60 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
27b70 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
27b80 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
27b90 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
27ba0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
27bb0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
27bc0 69 6c 64 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ild       /* If 
27bd0 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
27be0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
27bf0 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
27c00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b  */.){.  int idx;
27c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
27c20 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
27c30 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
27c40 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
27c50 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
27c60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
27c70 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
27c80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
27c90 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f  te of content fo
27ca0 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61  r any cell in da
27cb0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  ta[] */.  int en
27cc0 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
27cd0 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
27ce0 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
27cf0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
27d00 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
27d10 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
27d20 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
27d30 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
27d40 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
27d50 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
27d60 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
27d70 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20  o data[] of the 
27d80 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
27d90 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
27da0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
27db0 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
27dc0 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
27dd0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
27de0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
27df0 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
27e00 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
27e10 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tr;          /* 
27e20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20  Used for moving 
27e30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75  information arou
27e40 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nd in data[] */.
27e50 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28  .  int nSkip = (
27e60 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b  iChild ? 4 : 0);
27e70 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
27e80 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
27e90 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
27ea0 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
27eb0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
27ec0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
27ed0 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
27ee0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
27ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27f00 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
27f10 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
27f20 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  >aOvfl) );.  ass
27f30 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
27f40 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
27f50 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
27f60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27f70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
27f80 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
27f90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
27fa0 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
27fb0 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
27fc0 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
27fd0 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
27fe0 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
27ff0 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
28000 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
28010 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
28020 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
28030 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
28040 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
28050 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
28060 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
28070 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
28080 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
28090 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
280a0 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  aOvfl[0])) );.  
280b0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
280c0 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
280d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
280e0 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29  l[j].idx = (u16)
280f0 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
28100 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
28110 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
28120 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28140 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
28150 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28160 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
28170 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28180 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
28190 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
281a0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
281b0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
281c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
281d0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
281e0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
281f0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
28200 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
28210 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
28220 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
28230 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
28240 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
28250 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
28260 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
28270 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67       rc = defrag
28280 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
28290 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
282a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
282b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
282c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f 70       }.      top
282d0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
282e0 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
282f0 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
28300 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
28310 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
28320 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
28330 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
28340 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
28350 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
28360 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
28370 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66 20 28  +5]) );.    if (
28380 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
28390 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
283a0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
283b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
283c0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
283d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
283e0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
283f0 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
28400 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
28410 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
28420 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
28430 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
28440 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
28450 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
28460 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
28470 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74  =end-2, ptr=&dat
28480 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
28490 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
284a0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
284b0 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
284c0 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
284d0 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
284e0 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
284f0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
28500 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
28510 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  e->nCell);.#ifnd
28520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
28530 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
28540 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
28550 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
28560 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
28570 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
28580 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
28590 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
285a0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
285b0 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
285c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
285d0 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
285e0 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
285f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
28600 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
28610 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 23   pCell);.    }.#
28620 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
28630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28640 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
28650 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
28660 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
28670 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
28680 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
28690 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
286a0 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
286b0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
286c0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
286d0 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
286e0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
286f0 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
28700 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
28710 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
28720 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
28730 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
28740 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
28750 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
28760 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
28770 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
28780 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
28790 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
287a0 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
287b0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
287c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
287d0 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
287e0 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
287f0 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
28800 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
28810 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
28820 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
28830 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
28840 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
28850 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
28860 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28870 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
28880 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
28890 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
288a0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
288b0 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
288c0 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
288d0 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
288e0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
288f0 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
28900 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
28910 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
28920 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
28930 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
28940 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
28950 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28960 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
28970 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
28980 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
28990 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  & nCell<=MX_CELL
289a0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
289b0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
289c0 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61  Bt)<=5460 );.  a
289d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
289e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
289f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
28a00 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
28a10 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
28a20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
28a30 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
28a40 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
28a50 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
28a60 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
28a70 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d  e(&data[hdr+5])=
28a80 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70  =nUsable );..  p
28a90 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b  Cellptr = &data[
28aa0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
28ab0 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  t + nCell*2];.  
28ac0 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62  cellbody = nUsab
28ad0 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c  le;.  for(i=nCel
28ae0 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
28af0 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d  .    pCellptr -=
28b00 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   2;.    cellbody
28b10 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   -= aSize[i];.  
28b20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
28b30 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  ptr, cellbody);.
28b40 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
28b50 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
28b60 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
28b70 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
28b80 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
28b90 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
28ba0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
28bb0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
28bc0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43  ge->nFree -= (nC
28bd0 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20  ell*2 + nUsable 
28be0 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  - cellbody);.  p
28bf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75  Page->nCell = (u
28c00 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  16)nCell;.}../*.
28c10 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
28c20 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
28c30 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
28c40 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
28c50 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
28c60 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
28c70 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
28c80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
28c90 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
28ca0 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
28cb0 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
28cc0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
28cd0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
28ce0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
28cf0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
28d00 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
28d10 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
28d20 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
28d30 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
28d40 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
28d50 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
28d60 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
28d70 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
28d80 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
28d90 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
28da0 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
28db0 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
28dc0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
28dd0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
28de0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
28df0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
28e00 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
28e10 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
28e20 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
28e30 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
28e40 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
28e50 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
28e60 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
28e70 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
28e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
28e90 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
28ea0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
28eb0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
28ec0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
28ed0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
28ee0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
28ef0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
28f00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28f10 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
28f20 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
28f30 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
28f40 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
28f50 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
28f60 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
28f70 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
28f80 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
28f90 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
28fa0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
28fb0 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
28fc0 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
28fd0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
28fe0 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
28ff0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
29000 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
29010 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61  d of trying bala
29020 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
29030 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
29040 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
29050 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
29060 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
29070 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
29080 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
29090 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
290a0 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
290b0 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
290c0 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
290d0 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
290e0 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
290f0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
29100 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
29110 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
29120 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
29130 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
29140 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
29150 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
29160 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
29170 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
29180 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
29190 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
291a0 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
291b0 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
291c0 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
291d0 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
291e0 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
291f0 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
29200 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
29210 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
29220 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e page..**.** Th
29230 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
29240 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
29250 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70   a temporary cop
29260 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  y of the divider
29270 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69  .** cell that wi
29280 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ll be inserted i
29290 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63  nto pParent. Suc
292a0 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  h a cell consist
292b0 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65  s of a 4.** byte
292c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c   page number fol
292d0 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61  lowed by a varia
292e0 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
292f0 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  er. In other.** 
29300 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31  words, at most 1
29310 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74  3 bytes. Hence t
29320 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
29330 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c   must be at.** l
29340 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e  east 13 bytes in
29350 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
29360 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
29370 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ck(MemPage *pPar
29380 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  ent, MemPage *pP
29390 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29  age, u8 *pSpace)
293a0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f  {.  BtShared *co
293b0 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d  nst pBt = pPage-
293c0 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72  >pBt;    /* B-Tr
293d0 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee Database */. 
293e0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20   MemPage *pNew; 
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29400 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
29410 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
29420 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
29430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29440 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
29450 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n Code */.  Pgno
29460 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20   pgnoNew;       
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29480 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
29490 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73  of pNew */..  as
294a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
294b0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
294c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
294d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
294e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
294f0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
29500 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
29510 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29520 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ==1 );..  if( pP
29530 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20  age->nCell<=0 ) 
29540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
29550 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
29560 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
29570 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
29580 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
29590 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
295a0 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d  f .  ** pPage. M
295b0 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ake the parent p
295c0 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f  age writable, so
295d0 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69   that the new di
295e0 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20  vider cell.  ** 
295f0 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e  may be inserted.
29600 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f   If both these o
29610 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75  perations are su
29620 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65  ccessful, procee
29630 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  d..  */.  rc = a
29640 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
29650 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
29660 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20  noNew, 0, 0);.. 
29670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29680 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70  OK ){..    u8 *p
29690 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d  Out = &pSpace[4]
296a0 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  ;.    u8 *pCell 
296b0 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
296c0 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36  ].pCell;.    u16
296d0 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
296e0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
296f0 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74  ll);.    u8 *pSt
29700 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  op;..    assert(
29710 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29720 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70  riteable(pNew->p
29730 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61  DbPage) );.    a
29740 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
29750 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54  ata[0]==(PTF_INT
29760 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
29770 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20  |PTF_LEAF) );.  
29780 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
29790 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
297a0 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
297b0 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  F);.    assemble
297c0 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
297d0 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
297e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
297f0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
29800 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
29810 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
29820 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65  ap.    ** with e
29830 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
29840 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
29850 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
29860 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  e .    ** cell o
29870 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e  n the page to an
29880 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
29890 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
298a0 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  se.    ** operat
298b0 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20  ions fails, the 
298c0 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
298d0 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74  et, but the cont
298e0 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
298f0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61  he parent page a
29900 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c  re still manipul
29910 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65  ated by thh code
29920 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54   below..    ** T
29930 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68  hat is Ok, at th
29940 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72  is point the par
29950 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72  ent page is guar
29960 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  anteed to.    **
29970 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
29980 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  rty. Returning a
29990 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c  n error code wil
299a0 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a  l cause a.    **
299b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69   rollback, undoi
299c0 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ng any changes m
299d0 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ade to the paren
299e0 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
299f0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
29a00 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  UUM ){.      rc 
29a10 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
29a20 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
29a30 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
29a40 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
29a50 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d  ( szCell>pNew->m
29a60 69 6e 4c 6f 63 61 6c 20 26 26 20 72 63 3d 3d 53  inLocal && rc==S
29a70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29a80 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
29a90 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20  utOvflPtr(pNew, 
29aa0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  pCell);.      }.
29ab0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
29ac0 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72  Create a divider
29ad0 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20   cell to insert 
29ae0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68  into pParent. Th
29af0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  e divider cell. 
29b00 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f     ** consists o
29b10 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20  f a 4-byte page 
29b20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65  number (the page
29b30 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65   number of pPage
29b40 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76  ) and.    ** a v
29b50 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
29b60 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20  ey value (which 
29b70 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
29b80 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20   value as the.  
29b90 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
29ba0 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20   on pPage)..    
29bb0 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e  **.    ** To fin
29bc0 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  d the largest ke
29bd0 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65  y value on pPage
29be0 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65  , first find the
29bf0 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20   right-most .   
29c00 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
29c10 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f  e. The first two
29c20 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20   fields of this 
29c30 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20  cell are the .  
29c40 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67    ** record-leng
29c50 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  th (a variable l
29c60 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74  ength integer at
29c70 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e   most 32-bits in
29c80 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e   size).    ** an
29c90 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  d the key value 
29ca0 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
29cb0 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20  th integer, may 
29cc0 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e  have any value).
29cd0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
29ce0 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e  t of the while(.
29cf0 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20  ..) loops below 
29d00 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72  skips over the r
29d10 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20  ecord-length.   
29d20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73   ** field. The s
29d30 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29  econd while(...)
29d40 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65   loop copies the
29d50 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20   key value from 
29d60 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  the.    ** cell 
29d70 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68  on pPage into th
29d80 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  e pSpace buffer.
29d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c  .    */.    pCel
29da0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
29db0 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
29dc0 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  -1);.    pStop =
29dd0 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
29de0 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b  while( (*(pCell+
29df0 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  +)&0x80) && pCel
29e00 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70  l<pStop );.    p
29e10 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
29e20 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a  ;.    while( ((*
29e30 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65  (pOut++) = *(pCe
29e40 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20  ll++))&0x80) && 
29e50 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a  pCell<pStop );..
29e60 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
29e70 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
29e80 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ll into pParent.
29e90 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65   */.    insertCe
29ea0 6c 6c 28 70 50 61 72 65 6e 74 2c 70 50 61 72 65  ll(pParent,pPare
29eb0 6e 74 2d 3e 6e 43 65 6c 6c 2c 70 53 70 61 63 65  nt->nCell,pSpace
29ec0 2c 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61  ,(int)(pOut-pSpa
29ed0 63 65 29 2c 30 2c 70 50 61 67 65 2d 3e 70 67 6e  ce),0,pPage->pgn
29ee0 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  o);..    /* Set 
29ef0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
29f00 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65  pointer of pPare
29f10 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nt to point to t
29f20 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
29f30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
29f40 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
29f50 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
29f60 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20  8], pgnoNew);.  
29f70 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
29f80 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
29f90 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
29fa0 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
29fb0 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
29fc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
29fd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
29fe0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
29ff0 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  */..#if 0./*.** 
2a000 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
2a010 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
2a020 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  e anything to th
2a030 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53  e operation of S
2a040 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20  QLite..** it is 
2a050 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61  sometimes activa
2a060 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  ted temporarily 
2a070 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20  while debugging 
2a080 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65  code responsible
2a090 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67   .** for setting
2a0a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2a0b0 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
2a0c0 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50  int ptrmapCheckP
2a0d0 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61  ages(MemPage **a
2a0e0 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65  pPage, int nPage
2a0f0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
2a100 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67   for(i=0; i<nPag
2a110 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e  e; i++){.    Pgn
2a120 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20  o n;.    u8 e;. 
2a130 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2a140 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20  e = apPage[i];. 
2a150 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
2a160 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2a170 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a180 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20  ->isInit );..   
2a190 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67   for(j=0; j<pPag
2a1a0 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a  e->nCell; j++){.
2a1b0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
2a1c0 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a  nfo;.      u8 *z
2a1d0 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20  ;.     .      z 
2a1e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2a1f0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , j);.      sqli
2a200 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
2a210 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26  lPtr(pPage, z, &
2a220 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
2a230 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
2a240 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2a250 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
2a260 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  &z[info.iOverflo
2a270 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  w]);.        ptr
2a280 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c  mapGet(pBt, ovfl
2a290 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2a2a0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2a2b0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2a2c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
2a2d0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2a2e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2a2f0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  af ){.        Pg
2a300 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2a310 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  yte(z);.        
2a320 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
2a330 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
2a340 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2a350 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2a360 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2a370 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2a380 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
2a390 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2a3a0 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2a3b0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2a3c0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2a3d0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20  fset+8]);.      
2a3e0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
2a3f0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
2a400 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2a410 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2a420 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2a430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2a440 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2a450 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
2a460 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
2a470 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
2a480 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
2a490 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
2a4a0 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
2a4b0 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
2a4c0 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
2a4d0 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
2a4e0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
2a4f0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
2a500 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
2a510 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
2a520 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
2a530 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
2a540 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
2a550 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
2a560 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
2a570 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
2a580 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
2a590 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2a5a0 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
2a5b0 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
2a5c0 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
2a5d0 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
2a5e0 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
2a5f0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
2a600 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
2a610 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
2a620 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
2a630 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
2a640 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
2a650 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
2a660 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
2a670 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2a680 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
2a690 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
2a6a0 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
2a6b0 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
2a6c0 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
2a6d0 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
2a6e0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
2a6f0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
2a700 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
2a710 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
2a720 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
2a730 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2a740 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
2a750 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
2a760 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
2a770 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
2a780 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
2a790 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
2a7a0 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
2a7b0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
2a7c0 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
2a7d0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2a7e0 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
2a7f0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
2a800 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
2a810 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
2a820 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
2a830 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2a840 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
2a850 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
2a860 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
2a870 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
2a880 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
2a890 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
2a8a0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
2a8b0 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
2a8c0 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
2a8d0 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
2a8e0 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
2a8f0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
2a900 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
2a910 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
2a920 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
2a930 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2a940 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
2a950 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
2a960 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
2a970 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
2a980 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
2a990 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
2a9a0 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
2a9b0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2a9c0 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
2a9d0 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
2a9e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2a9f0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
2aa00 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
2aa10 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
2aa20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
2aa30 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
2aa40 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
2aa50 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2aa60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2aa70 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
2aa80 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2aa90 0a 2a 2a 20 62 75 66 66 65 72 20 70 61 67 65 2d  .** buffer page-
2aaa0 73 69 7a 65 20 62 79 74 65 73 20 69 6e 20 73 69  size bytes in si
2aab0 7a 65 2e 20 49 66 2c 20 69 6e 20 69 6e 73 65 72  ze. If, in inser
2aac0 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
2aad0 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
2aae0 67 65 20 28 70 50 61 72 65 6e 74 29 2c 20 74 68  ge (pParent), th
2aaf0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65  e parent page be
2ab00 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20  comes overfull, 
2ab10 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a  this buffer is.*
2ab20 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
2ab30 74 68 65 20 70 61 72 65 6e 74 73 20 6f 76 65 72  the parents over
2ab40 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
2ab50 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
2ab60 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
2ab70 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
2ab80 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
2ab90 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2aba0 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
2abb0 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
2abc0 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
2abd0 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
2abe0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
2abf0 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
2ac00 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
2ac10 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
2ac20 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
2ac30 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
2ac40 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
2ac50 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
2ac60 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
2ac70 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
2ac80 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
2ac90 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
2aca0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
2acb0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
2acc0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2acd0 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
2ace0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ad00 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
2ad10 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
2ad20 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
2ad30 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
2ad40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ad50 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
2ad60 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
2ad70 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad90 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
2ada0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
2adb0 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
2adc0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
2add0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
2ade0 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
2adf0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
2ae00 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  t nCell = 0;    
2ae10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ae20 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
2ae30 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69   apCell[] */.  i
2ae40 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30  nt nMaxCells = 0
2ae50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
2ae60 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
2ae70 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c   apCell, szCell,
2ae80 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74   aFrom. */.  int
2ae90 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20   nNew = 0;      
2aea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2aeb0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2aec0 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apNew[] */.  int
2aed0 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20   nOld;          
2aee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2aef0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2af00 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apOld[] */.  int
2af10 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20   i, j, k;       
2af20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2af30 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2af40 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20  int nxDiv;      
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2af60 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f  Next divider slo
2af70 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  t in pParent->aC
2af80 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ell[] */.  int r
2af90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2afa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2afb0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2afc0 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69  int leafCorrecti
2afd0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
2afe0 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
2aff0 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20  leaf.  0 if not 
2b000 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74  */.  int leafDat
2b010 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2b020 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
2b030 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20  ge is a leaf of 
2b040 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
2b050 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
2b060 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
2b070 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50    /* Bytes in pP
2b080 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68  age beyond the h
2b090 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  eader */.  int p
2b0a0 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ageFlags;       
2b0b0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2b0c0 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
2b0d0 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  [0] */.  int sub
2b0e0 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20  total;          
2b0f0 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61        /* Subtota
2b100 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65  l of bytes in ce
2b110 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20  lls on one page 
2b120 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31  */.  int iSpace1
2b130 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b140 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
2b150 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
2b160 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76  1[] */.  int iOv
2b170 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20  flSpace = 0;    
2b180 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
2b190 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f  nused byte of aO
2b1a0 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20  vflSpace[] */.  
2b1b0 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20  int szScratch;  
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b1d0 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20  Size of scratch 
2b1e0 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64  memory requested
2b1f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2b200 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
2b210 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
2b220 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
2b230 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  gs */.  MemPage 
2b240 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20  *apCopy[NB];    
2b250 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20       /* Private 
2b260 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b  copies of apOld[
2b270 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d  ] pages */.  Mem
2b280 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32  Page *apNew[NB+2
2b290 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ];        /* pPa
2b2a0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20  ge and up to NB 
2b2b0 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62  siblings after b
2b2c0 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38  alancing */.  u8
2b2d0 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20   *pRight;       
2b2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2b2f0 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74  cation in parent
2b300 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e   of right-siblin
2b310 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  g pointer */.  u
2b320 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20  8 *apDiv[NB-1]; 
2b330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2b340 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20  ivider cells in 
2b350 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  pParent */.  int
2b360 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   cntNew[NB+2];  
2b370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2b380 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66  ex in aCell[] of
2b390 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68   cell after i-th
2b3a0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73   page */.  int s
2b3b0 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  zNew[NB+2];     
2b3c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69          /* Combi
2b3d0 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  ned size of cell
2b3e0 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20  s place on i-th 
2b3f0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2b400 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  pCell = 0;      
2b410 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
2b420 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
2b430 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
2b440 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2b450 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
2b460 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2b470 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
2b480 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20   u8 *aSpace1;   
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b4a0 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
2b4b0 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
2b4c0 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  lls */.  Pgno pg
2b4d0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
2b4e0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61        /* Temp va
2b4f0 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67  r to store a pag
2b500 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a  e number in */..
2b510 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d    pBt = pParent-
2b520 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
2b530 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b540 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2b550 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b560 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2b570 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2b580 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a  Page) );..#if 0.
2b590 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2b5a0 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
2b5b0 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
2b5c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
2b5d0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23  arent->pgno));.#
2b5e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74  endif..  /* At t
2b5f0 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e  his point pParen
2b600 74 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f  t may have at mo
2b610 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20  st one overflow 
2b620 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a  cell. And if.  *
2b630 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  * this overflow 
2b640 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c  cell is present,
2b650 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20   it must be the 
2b660 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20  cell with .  ** 
2b670 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78  index iParentIdx
2b680 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20  . This scenario 
2b690 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e  comes about when
2b6a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
2b6b0 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69   ** is called (i
2b6c0 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20  ndirectly) from 
2b6d0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
2b6e0 74 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  te(). */.  asser
2b6f0 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
2b700 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
2b710 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2b720 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2b730 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2b740 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
2b750 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69  >aOvfl[0].idx==i
2b760 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20  ParentIdx );..  
2b770 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20  if( !aOvflSpace 
2b780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b790 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2b7a0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
2b7b0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
2b7c0 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f  balance. Also lo
2b7d0 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69  cate the cells i
2b7e0 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20  n pParent .  ** 
2b7f0 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20  that divide the 
2b800 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74  siblings. An att
2b810 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2b820 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
2b830 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72   on .  ** either
2b840 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
2b850 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
2b860 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
2b870 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
2b880 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61  .  ** if there a
2b890 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
2b8a0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
2b8b0 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20   other side. If 
2b8c0 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
2b8d0 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
2b8e0 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
2b8f0 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
2b900 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a  nt are taken.  .
2b910 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
2b920 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74  oop also drops t
2b930 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2b940 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2b950 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a   page. This.  **
2b960 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e   way, the remain
2b970 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74  der of the funct
2b980 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ion does not hav
2b990 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61  e to deal with a
2b9a0 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  ny.  ** overflow
2b9b0 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61   cells in the pa
2b9c0 72 65 6e 74 20 70 61 67 65 2c 20 61 73 20 69 66  rent page, as if
2b9d0 20 6f 6e 65 20 65 78 69 73 74 65 64 20 69 74 20   one existed it 
2b9e0 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
2b9f0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 20   been removed.  
2ba00 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74  */.  i = pParent
2ba10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50  ->nOverflow + pP
2ba20 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  arent->nCell;.  
2ba30 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e  if( i<2 ){.    n
2ba40 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f  xDiv = 0;.    nO
2ba50 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73  ld = i+1;.  }els
2ba60 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b  e{.    nOld = 3;
2ba70 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74  .    if( iParent
2ba80 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  Idx==0 ){       
2ba90 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
2baa0 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
2bab0 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e  }else if( iParen
2bac0 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20  tIdx==i ){.     
2bad0 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20   nxDiv = i-2;.  
2bae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
2baf0 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64  xDiv = iParentId
2bb00 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  x-1;.    }.    i
2bb10 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 2;.  }.  if( 
2bb20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74  (i+nxDiv-pParent
2bb30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50  ->nOverflow)==pP
2bb40 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2bb50 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50      pRight = &pP
2bb60 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
2bb70 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
2bb80 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  8];.  }else{.   
2bb90 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65   pRight = findCe
2bba0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
2bbb0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2bbc0 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70  erflow);.  }.  p
2bbd0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
2bbe0 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28  Right);.  while(
2bbf0 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67   1 ){.    rc = g
2bc00 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2bc10 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b  t, pgno, &apOld[
2bc20 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  i]);.    if( rc 
2bc30 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
2bc40 61 70 4f 6c 64 2c 20 30 2c 20 69 2a 73 69 7a 65  apOld, 0, i*size
2bc50 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
2bc60 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2bc70 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
2bc80 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
2bc90 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
2bca0 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
2bcb0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
2bcc0 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
2bcd0 6b 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72  k;..    if( pPar
2bce0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 26  ent->nOverflow &
2bcf0 26 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65  & i+nxDiv==pPare
2bd00 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  nt->aOvfl[0].idx
2bd10 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
2bd20 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f  i] = pParent->aO
2bd30 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
2bd40 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2bd50 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
2bd60 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
2bd70 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
2bd80 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
2bd90 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e        pParent->n
2bda0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2bdb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2bdc0 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
2bdd0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
2bde0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2bdf0 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70  erflow);.      p
2be00 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2be10 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2be20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2be30 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2be40 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20  apDiv[i]);..    
2be50 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65    /* Drop the ce
2be60 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ll from the pare
2be70 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69  nt page. apDiv[i
2be80 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  ] still points t
2be90 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  o.      ** the c
2bea0 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70  ell within the p
2beb0 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75  arent, even thou
2bec0 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  gh it has been d
2bed0 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  ropped..      **
2bee0 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
2bef0 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61  cause dropping a
2bf00 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77   cell only overw
2bf10 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a  rites the first.
2bf20 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2bf30 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74  tes of it, and t
2bf40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2bf50 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66  s not need the f
2bf60 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
2bf70 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
2bf80 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f  divider cell. So
2bf90 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
2bfa0 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20  safe to use.    
2bfb0 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20    ** later on.  
2bfc0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2bfd0 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65  ** Unless SQLite
2bfe0 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
2bff0 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2c000 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2c010 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  ,.      ** the d
2c020 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ropCell() routin
2c030 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  e will overwrite
2c040 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2c050 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20   with zeroes..  
2c060 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2c070 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79  ase, temporarily
2c080 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69   copy the cell i
2c090 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61  nto the aOvflSpa
2c0a0 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75  ce[].      ** bu
2c0b0 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65  ffer. It will be
2c0c0 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69   copied out agai
2c0d0 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  n as soon as the
2c0e0 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72   aSpace[] buffer
2c0f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c  .      ** is all
2c100 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64  ocated.  */.#ifd
2c110 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
2c120 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65  _DELETE.      me
2c130 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65  mcpy(&aOvflSpace
2c140 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e  [apDiv[i]-pParen
2c150 74 2d 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76  t->aData], apDiv
2c160 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a  [i], szNew[i]);.
2c170 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
2c180 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44   &aOvflSpace[apD
2c190 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61  iv[i]-pParent->a
2c1a0 44 61 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20  Data];.#endif.  
2c1b0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2c1c0 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
2c1d0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2c1e0 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
2c1f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
2c200 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
2c210 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
2c220 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
2c230 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
2c240 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
2c250 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
2c260 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
2c270 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
2c280 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
2c290 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
2c2a0 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65  .  k = pBt->page
2c2b0 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69  Size + ROUND8(si
2c2c0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
2c2d0 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
2c2e0 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
2c2f0 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
2c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c310 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
2c320 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
2c330 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
2c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c350 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
2c360 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
2c370 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c390 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
2c3a0 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20      + k*nOld;   
2c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3d0 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73    /* Page copies
2c3e0 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61   (apCopy) */.  a
2c3f0 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  pCell = sqlite3S
2c400 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a  cratchMalloc( sz
2c410 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66  Scratch ); .  if
2c420 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
2c430 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2c440 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
2c450 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2c460 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
2c470 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  u16*)&apCell[nMa
2c480 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63  xCells];.  aSpac
2c490 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  e1 = (u8*)&szCel
2c4a0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
2c4b0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2c4c0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70  TE_ALIGNMENT(aSp
2c4d0 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  ace1) );..  /*. 
2c4e0 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72   ** Load pointer
2c4f0 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  s to all cells o
2c500 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  n sibling pages 
2c510 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20  and the divider 
2c520 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
2c530 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c  the local apCell
2c540 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20  [] array.  Make 
2c550 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69  copies of the di
2c560 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
2c570 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
2c580 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65  ined from aSpace
2c590 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  1[] and remove t
2c5a0 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43  he the divider C
2c5b0 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
2c5c0 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
2c5d0 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
2c5e0 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
2c5f0 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
2c600 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
2c610 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
2c620 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
2c630 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
2c640 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
2c650 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
2c660 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
2c670 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
2c680 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2c690 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
2c6a0 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
2c6b0 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
2c6c0 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
2c6d0 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
2c6e0 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
2c6f0 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
2c700 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
2c710 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
2c720 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
2c730 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
2c740 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
2c750 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
2c760 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
2c770 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
2c780 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
2c790 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
2c7a0 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
2c7b0 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
2c7c0 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
2c7d0 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43  ys..  */.  leafC
2c7e0 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
2c7f0 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
2c800 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
2c810 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
2c820 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
2c830 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
2c840 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f  imit;.    .    /
2c850 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
2c860 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61  nything else, ta
2c870 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2c880 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73   i'th original s
2c890 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68  ibling.    ** Th
2c8a0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
2c8b0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
2c8c0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
2c8d0 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20  opies rather.   
2c8e0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
2c8f0 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
2c900 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
2c910 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
2c920 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
2c930 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
2c940 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
2c950 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
2c960 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
2c970 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b  mPage*)&aSpace1[
2c980 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
2c990 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  k*i];.    memcpy
2c9a0 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c  (pOld, apOld[i],
2c9b0 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
2c9c0 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61  );.    pOld->aDa
2c9d0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c  ta = (void*)&pOl
2c9e0 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d[1];.    memcpy
2c9f0 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70  (pOld->aData, ap
2ca00 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
2ca10 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
2ca20 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64      limit = pOld
2ca30 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
2ca40 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72  verflow;.    for
2ca50 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
2ca60 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2ca70 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
2ca80 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65  ls );.      apCe
2ca90 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
2caa0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
2cab0 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43  d, j);.      szC
2cac0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
2cad0 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
2cae0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20  pCell[nCell]);. 
2caf0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2cb00 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
2cb10 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
2cb20 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
2cb30 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20   = szNew[i];.   
2cb40 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2cb50 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2cb60 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
2cb70 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2cb80 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
2cb90 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
2cba0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
2cbb0 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
2cbc0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
2cbd0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
2cbe0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2cbf0 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
2cc00 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
2cc10 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
2cc20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
2cc30 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
2cc40 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
2cc50 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2cc60 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
2cc70 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
2cc80 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
2cc90 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
2cca0 6e 43 65 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c  nCell] -= (u16)l
2ccb0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
2ccc0 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
2ccd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2cce0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
2ccf0 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
2cd00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
2cd10 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20  d->hdrOffset==0 
2cd20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
2cd30 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
2cd40 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
2cd50 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
2cd60 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
2cd70 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
2cd80 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
2cd90 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
2cda0 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
2cdb0 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pOld->aData[8],
2cdc0 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
2cdd0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2cde0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2cdf0 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==4 );.        i
2ce00 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  f( szCell[nCell]
2ce10 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
2ce20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
2ce30 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65  any cells smalle
2ce40 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20  r than 4 bytes. 
2ce50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  */.          szC
2ce60 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a  ell[nCell] = 4;.
2ce70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ce80 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  }.      nCell++;
2ce90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2cea0 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74  .  ** Figure out
2ceb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
2cec0 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68  ages needed to h
2ced0 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65  old all nCell ce
2cee0 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20  lls..  ** Store 
2cef0 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22  this number in "
2cf00 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74  k".  Also comput
2cf10 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20  e szNew[] which 
2cf20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a  is the total.  *
2cf30 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  * size of all ce
2cf40 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  lls on the i-th 
2cf50 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b  page and cntNew[
2cf60 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  ] which is the i
2cf70 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43  ndex.  ** in apC
2cf80 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c  ell[] of the cel
2cf90 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70  l that divides p
2cfa0 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20  age i from page 
2cfb0 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e  i+1.  .  ** cntN
2cfc0 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75  ew[k] should equ
2cfd0 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20  al nCell..  **. 
2cfe0 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75   ** Values compu
2cff0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
2d000 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k:.  **.  **    
2d010 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f         k: The to
2d020 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  tal number of si
2d030 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a  bling pages.  **
2d040 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70      szNew[i]: Sp
2d050 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65  aced used on the
2d060 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
2d070 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65  ge..  **   cntNe
2d080 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61  w[i]: Index in a
2d090 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
2d0a0 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72  ll[] for the fir
2d0b0 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20  st cell to.  ** 
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
2d0d0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d   right of the i-
2d0e0 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
2d0f0 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63  .  ** usableSpac
2d100 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  e: Number of byt
2d110 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69  es of space avai
2d120 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69  lable on each si
2d130 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a  bling..  ** .  *
2d140 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20  /.  usableSpace 
2d150 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2d160 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72  e - 12 + leafCor
2d170 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73  rection;.  for(s
2d180 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69  ubtotal=k=i=0; i
2d190 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
2d1a0 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78    assert( i<nMax
2d1b0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62  Cells );.    sub
2d1c0 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b  total += szCell[
2d1d0 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20  i] + 2;.    if( 
2d1e0 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c  subtotal > usabl
2d1f0 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eSpace ){.      
2d200 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
2d210 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  tal - szCell[i];
2d220 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d  .      cntNew[k]
2d230 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
2d240 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b  leafData ){ i--;
2d250 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61   }.      subtota
2d260 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b  l = 0;.      k++
2d270 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42  ;.      if( k>NB
2d280 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54  +1 ){ rc = SQLIT
2d290 45 5f 43 4f 52 52 55 50 54 3b 20 67 6f 74 6f 20  E_CORRUPT; goto 
2d2a0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2d2b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
2d2c0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
2d2d0 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
2d2e0 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
2d2f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
2d300 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
2d310 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
2d320 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
2d330 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
2d340 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
2d350 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
2d360 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
2d370 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
2d380 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
2d390 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
2d3a0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
2d3b0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
2d3c0 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
2d3d0 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
2d3e0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
2d3f0 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
2d400 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
2d410 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
2d420 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
2d430 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
2d440 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
2d450 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
2d460 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
2d470 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
2d480 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
2d490 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
2d4a0 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
2d4b0 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
2d4c0 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
2d4d0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
2d4e0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
2d4f0 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
2d500 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
2d510 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
2d520 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
2d530 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
2d540 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
2d550 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
2d560 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
2d570 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
2d580 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
2d590 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
2d5a0 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
2d5b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2d5c0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
2d5d0 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
2d5e0 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
2d5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2d600 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
2d610 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
2d620 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
2d630 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
2d640 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
2d650 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
2d660 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
2d670 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
2d680 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
2d690 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2d6a0 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
2d6b0 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
2d6c0 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
2d6d0 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
2d6e0 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
2d6f0 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
2d700 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
2d710 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
2d720 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
2d730 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
2d740 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
2d750 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
2d760 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
2d770 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
2d780 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
2d790 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
2d7a0 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
2d7b0 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
2d7c0 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
2d7d0 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
2d7e0 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20  r pPage is.  ** 
2d7f0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
2d800 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
2d810 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
2d820 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
2d830 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
2d840 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
2d850 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
2d860 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
2d870 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
2d880 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
2d890 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
2d8a0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
2d8b0 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  ) );..  TRACE(("
2d8c0 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
2d8d0 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61   %d %d  ",.    a
2d8e0 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a  pOld[0]->pgno, .
2d8f0 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70      nOld>=2 ? ap
2d900 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[1]->pgno : 0
2d910 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
2d920 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apOld[2]->pgno :
2d930 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20   0.  ));..  /*. 
2d940 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
2d950 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
2d960 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
2d970 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
2d980 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e    if( apOld[0]->
2d990 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72  pgno<=1 ){.    r
2d9a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2d9b0 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  PT;.    goto bal
2d9c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2d9d0 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20  }.  pageFlags = 
2d9e0 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b  apOld[0]->aData[
2d9f0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0];.  for(i=0; i
2da00 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  <k; i++){.    Me
2da10 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20  mPage *pNew;.   
2da20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20   if( i<nOld ){. 
2da30 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
2da40 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b  w[i] = apOld[i];
2da50 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  .      apOld[i] 
2da60 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2da70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2da80 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2da90 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
2daa0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2dab0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2dac0 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nup;.    }else{.
2dad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
2dae0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2daf0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2db00 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
2db10 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20  gno, pgno, 0);. 
2db20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2db30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2db40 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
2db50 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  i] = pNew;.     
2db60 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20   nNew++;..      
2db70 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  /* Set the point
2db80 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
2db90 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
2dba0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
2dbb0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2dbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2dbd0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2dbe0 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
2dbf0 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
2dc00 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
2dc10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2dc20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2dc30 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2dc40 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
2dc50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2dc60 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
2dc70 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74  y old pages that
2dc80 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64   were not reused
2dc90 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20   as new pages.. 
2dca0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   */.  while( i<n
2dcb0 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Old ){.    rc = 
2dcc0 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
2dcd0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
2dce0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2dcf0 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61  eanup;.    relea
2dd00 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
2dd10 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d  ;.    apOld[i] =
2dd20 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d   0;.    i++;.  }
2dd30 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20  ..  /*.  ** Put 
2dd40 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e  the new pages in
2dd50 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
2dd60 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f  .  This helps to
2dd70 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69  .  ** keep entri
2dd80 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
2dd90 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20  ile in order so 
2dda0 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a  that a scan.  **
2ddb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
2ddc0 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
2ddd0 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e  hrough the file.
2dde0 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74    That.  ** in t
2ddf0 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70  urn helps the op
2de00 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74  erating system t
2de10 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a  o deliver pages.
2de20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69    ** from the di
2de30 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e  sk more rapidly.
2de40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28  .  **.  ** An O(
2de50 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73  n^2) insertion s
2de60 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ort algorithm is
2de70 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65   used, but since
2de80 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72  .  ** n is never
2de90 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61   more than NB (a
2dea0 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29   small constant)
2deb0 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20  , that should.  
2dec0 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ** not be a prob
2ded0 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  lem..  **.  ** W
2dee0 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20  hen NB==3, this 
2def0 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  one optimization
2df00 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62   makes the datab
2df10 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32  ase.  ** about 2
2df20 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61  5% faster for la
2df30 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61  rge insertions a
2df40 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20  nd deletions..  
2df50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2df60 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  k-1; i++){.    i
2df70 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b  nt minV = apNew[
2df80 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e  i]->pgno;.    in
2df90 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
2dfa0 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
2dfb0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
2dfc0 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28  apNew[j]->pgno<(
2dfd0 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
2dfe0 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
2dff0 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
2e000 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  = apNew[j]->pgno
2e010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e020 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
2e030 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
2e040 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
2e050 3b 0a 20 20 20 20 20 20 74 20 3d 20 61 70 4e 65  ;.      t = apNe
2e060 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
2e070 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b    pT = apNew[i];
2e080 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
2e090 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
2e0a0 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d       apNew[minI]
2e0b0 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pT;.    }.  }
2e0c0 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20  .  TRACE(("new: 
2e0d0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
2e0e0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
2e0f0 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77  d)\n",.    apNew
2e100 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77  [0]->pgno, szNew
2e110 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
2e120 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e   ? apNew[1]->pgn
2e130 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  o : 0, nNew>=2 ?
2e140 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
2e150 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e     nNew>=3 ? apN
2e160 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[2]->pgno : 0,
2e170 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
2e180 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
2e190 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d  w>=4 ? apNew[3]-
2e1a0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
2e1b0 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20  =4 ? szNew[3] : 
2e1c0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f  0,.    nNew>=5 ?
2e1d0 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20   apNew[4]->pgno 
2e1e0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
2e1f0 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
2e200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e210 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2e220 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2e230 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ge) );.  put4byt
2e240 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b  e(pRight, apNew[
2e250 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
2e260 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c  .  /*.  ** Evenl
2e270 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65  y distribute the
2e280 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b   data in apCell[
2e290 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77  ] across the new
2e2a0 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73   pages..  ** Ins
2e2b0 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ert divider cell
2e2c0 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61  s into pParent a
2e2d0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
2e2e0 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  j = 0;.  for
2e2f0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2e300 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d  +){.    /* Assem
2e310 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c  ble the new sibl
2e320 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
2e330 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
2e340 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61   apNew[i];.    a
2e350 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
2e360 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  ls );.    zeroPa
2e370 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
2e380 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  gs);.    assembl
2e390 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
2e3a0 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
2e3b0 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
2e3c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
2e3d0 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
2e3e0 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
2e3f0 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
2e400 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
2e410 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
2e420 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
2e430 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2e440 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
2e450 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
2e460 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
2e470 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
2e480 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
2e490 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2e4a0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2e4b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2e4c0 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43  i<nNew-1 && j<nC
2e4d0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
2e4e0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
2e4f0 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
2e500 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
2e510 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
2e520 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
2e530 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
2e540 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
2e550 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
2e560 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
2e570 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
2e580 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
2e590 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
2e5a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
2e5b0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
2e5c0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
2e5d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e5e0 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
2e5f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
2e600 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
2e610 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
2e620 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
2e630 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
2e640 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
2e650 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
2e660 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
2e670 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
2e680 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
2e690 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
2e6a0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
2e6b0 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
2e6c0 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
2e6d0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
2e6e0 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
2e6f0 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
2e700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
2e710 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2e720 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
2e730 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
2e740 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
2e750 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
2e760 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
2e770 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
2e780 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74      sz = 4 + put
2e790 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
2e7a0 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  , info.nKey);.  
2e7b0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
2e7c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e7d0 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
2e7e0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
2e7f0 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
2e800 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
2e810 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
2e820 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
2e830 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
2e840 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
2e850 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
2e860 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
2e870 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
2e880 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
2e890 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
2e8a0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
2e8b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
2e8c0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e sqlite3BtreePa
2e8d0 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
2e8e0 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
2e8f0 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
2e900 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
2e910 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
2e920 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
2e930 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
2e940 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
2e950 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
2e960 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
2e970 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
2e980 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
2e990 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
2e9a0 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
2e9b0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
2e9c0 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
2e9d0 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
2e9e0 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
2e9f0 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
2ea00 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
2ea10 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
2ea20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
2ea30 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
2ea40 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
2ea50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ea60 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
2ea70 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
2ea80 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
2ea90 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
2eaa0 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
2eab0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2eac0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
2ead0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2eae0 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a  iOvflSpace += sz
2eaf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2eb00 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
2eb10 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
2eb20 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c  ert( iOvflSpace<
2eb30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
2eb40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  ;.      rc = ins
2eb50 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
2eb60 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
2eb70 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e  z, pTemp, pNew->
2eb80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2eb90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2eba0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2ebb0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
2ebc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ebd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ebe0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2ebf0 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
2ec00 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
2ec10 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
2ec20 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
2ec30 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
2ec40 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
2ec50 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
2ec60 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
2ec70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
2ec80 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
2ec90 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
2eca0 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
2ecb0 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
2ecc0 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
2ecd0 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46   4);.  }..  /* F
2ece0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ix the pointer-m
2ecf0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
2ed00 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61  ll the cells tha
2ed10 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20 61  t were shifted a
2ed20 72 6f 75 6e 64 2e 20 0a 20 20 2a 2a 20 54 68 65  round. .  ** The
2ed30 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64  re are several d
2ed40 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
2ed50 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  f pointer-map en
2ed60 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20  tries that need 
2ed70 74 6f 0a 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  to.  ** be dealt
2ed80 20 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f   with by this ro
2ed90 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74  utine. Some of t
2eda0 68 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73  hese have been s
2edb0 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a  et already, but.
2edc0 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e    ** many have n
2edd0 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot. The followin
2ede0 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a  g is a summary:.
2edf0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 54    **.  **   1) T
2ee00 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
2ee10 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
2ee20 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
2ee30 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 2a 2a 20  t were not.  ** 
2ee40 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
2ee50 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2ee60 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
2ee70 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
2ee80 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73    **      been s
2ee90 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65  et. We don't nee
2eea0 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  d to worry about
2eeb0 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68   old siblings th
2eec0 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 20 20 20  at were.  **    
2eed0 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66    moved to the f
2eee0 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66  ree-list - the f
2eef0 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20 68  reePage() code h
2ef00 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20  as taken care.  
2ef10 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  **      of those
2ef20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 29  ..  **.  **   2)
2ef30 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   The pointer-map
2ef40 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
2ef50 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
2ef60 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  st overflow.  **
2ef70 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e        page in an
2ef80 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  y overflow chain
2ef90 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69  s used by new di
2efa0 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65  vider cells. The
2efb0 73 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 68 61  se .  **      ha
2efc0 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
2efd0 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
2efe0 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
2eff0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 2a  Cell() code..  *
2f000 2a 0a 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74  *.  **   3) If t
2f010 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
2f020 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
2f030 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
2f040 70 61 67 65 73 20 6f 66 0a 20 20 2a 2a 20 20 20  pages of.  **   
2f050 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20     cells stored 
2f060 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  on the sibling p
2f070 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ages may need to
2f080 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 2a   be updated..  *
2f090 2a 0a 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74  *.  **   4) If t
2f0a0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
2f0b0 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61   are not interna
2f0c0 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20  l intkey nodes, 
2f0d0 74 68 65 6e 20 61 6e 79 0a 20 20 2a 2a 20 20 20  then any.  **   
2f0e0 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
2f0f0 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20  s used by these 
2f100 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74  cells may need t
2f110 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 2a  o be updated.  *
2f120 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c  *      (internal
2f130 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65   intkey nodes ne
2f140 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  ver contain poin
2f150 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77  ters to overflow
2f160 20 70 61 67 65 73 29 2e 0a 20 20 2a 2a 0a 20 20   pages)..  **.  
2f170 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
2f180 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
2f190 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
2f1a0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
2f1b0 70 0a 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72  p.  **      entr
2f1c0 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68  ies for the righ
2f1d0 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  t-child pages of
2f1e0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61   each sibling ma
2f1f0 79 20 6e 65 65 64 0a 20 20 2a 2a 20 20 20 20 20  y need.  **     
2f200 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
2f210 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 73 65 73 20    **.  ** Cases 
2f220 31 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c  1 and 2 are deal
2f230 74 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20  t with above by 
2f240 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20  other code. The 
2f250 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 62  following.  ** b
2f260 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
2f270 63 61 73 65 73 20 33 20 61 6e 64 20 34 2e 20 53  cases 3 and 4. S
2f280 69 6e 63 65 20 73 65 74 74 69 6e 67 20 61 20 70  ince setting a p
2f290 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
2f2a0 0a 20 20 2a 2a 20 69 73 20 61 20 72 65 6c 61 74  .  ** is a relat
2f2b0 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20  ively expensive 
2f2c0 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 20  operation, this 
2f2d0 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
2f2e0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 6d 61 70 20  ointer.  ** map 
2f2f0 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c  entries for chil
2f300 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  d or overflow pa
2f310 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 63  ges that have ac
2f320 74 75 61 6c 6c 79 20 6d 6f 76 65 64 0a 20 20 2a  tually moved.  *
2f330 2a 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e  * between pages.
2f340 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
2f350 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 4d  OVACUUM ){.    M
2f360 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
2f370 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d  pNew[0];.    Mem
2f380 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
2f390 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[0];.    int 
2f3a0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64  nOverflow = pOld
2f3b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
2f3c0 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20   int iNextOld = 
2f3d0 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f  pOld->nCell + nO
2f3e0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74  verflow;.    int
2f3f0 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f   iOverflow = (nO
2f400 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e  verflow ? pOld->
2f410 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d  aOvfl[0].idx : -
2f420 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2f450 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
2f460 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
2f470 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
2f4a0 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
2f4b0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
2f4c0 20 69 3c 6e 43 65 6c 6c 20 26 26 20 72 63 3d 3d   i<nCell && rc==
2f4d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
2f4e0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76  .      int isDiv
2f4f0 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ider = 0;.      
2f500 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f  while( i==iNextO
2f510 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ld ){.        /*
2f520 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
2f530 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
2f540 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
2f550 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20  st cell on old. 
2f560 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
2f570 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65  g page j. If the
2f580 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
2f590 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
2f5a0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
2f5b0 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
2f5c0 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64  n cell i was a d
2f5d0 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a  ivider cell. */.
2f5e0 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61          pOld = a
2f5f0 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20  pCopy[++j];.    
2f600 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69      iNextOld = i
2f610 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
2f620 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c  Old->nCell + pOl
2f630 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
2f640 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
2f650 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
2f660 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77         nOverflow
2f670 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
2f680 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ow;.          iO
2f690 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c  verflow = i + !l
2f6a0 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
2f6b0 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20  aOvfl[0].idx;.  
2f6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f6d0 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61  isDivider = !lea
2f6e0 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d  fData;  .      }
2f6f0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ..      assert(n
2f700 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f  Overflow>0 || iO
2f710 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20  verflow<i );.   
2f720 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
2f730 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61  low<2 || pOld->a
2f740 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c  Ovfl[0].idx==pOl
2f750 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d  d->aOvfl[1].idx-
2f760 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
2f770 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20  (nOverflow<3 || 
2f780 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69  pOld->aOvfl[1].i
2f790 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
2f7a0 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  2].idx-1);.     
2f7b0 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f   if( i==iOverflo
2f7c0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44  w ){.        isD
2f7d0 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  ivider = 1;.    
2f7e0 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72      if( (--nOver
2f7f0 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20  flow)>0 ){.     
2f800 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b       iOverflow++
2f810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f820 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
2f830 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20  ==cntNew[k] ){. 
2f840 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69         /* Cell i
2f850 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d   is the cell imm
2f860 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
2f870 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  ng the last cell
2f880 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20   on new.        
2f890 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  ** sibling page 
2f8a0 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  k. If the siblin
2f8b0 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20  gs are not leaf 
2f8c0 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20  pages of an.    
2f8d0 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d      ** intkey b-
2f8e0 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20  tree, then cell 
2f8f0 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20 63  i is a divider c
2f900 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ell.  */.       
2f910 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b   pNew = apNew[++
2f920 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
2f930 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74  !leafData ) cont
2f940 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2f950 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2f960 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2f970 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c     assert( j<nOl
2f980 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
2f990 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20  t( k<nNew );..  
2f9a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65      /* If the ce
2f9b0 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  ll was originall
2f9c0 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28  y divider cell (
2f9d0 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20  and is not now) 
2f9e0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f  or.      ** an o
2f9f0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72  verflow cell, or
2fa00 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73   if the cell was
2fa10 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69   located on a di
2fa20 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a  fferent sibling.
2fa30 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65        ** page be
2fa40 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69  fore the balanci
2fa50 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  ng, then the poi
2fa60 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
2fa70 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20   associated.    
2fa80 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68    ** with any ch
2fa90 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
2faa0 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
2fab0 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20   updated.  */.  
2fac0 20 20 20 20 69 66 28 20 69 73 44 69 76 69 64 65      if( isDivide
2fad0 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21  r || pOld->pgno!
2fae0 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
2faf0 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66         if( !leaf
2fb00 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
2fb10 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2fb20 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
2fb30 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c  byte(apCell[i]),
2fb40 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2fb50 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  New->pgno);.    
2fb60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2fb70 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77  ( szCell[i]>pNew
2fb80 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26 20 72 63  ->minLocal && rc
2fb90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fba0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
2fbb0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2fbc0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b  New, apCell[i]);
2fbd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fbe0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
2fbf0 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
2fc00 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  n ){.      for(i
2fc10 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
2fc20 4b 20 26 26 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  K && i<nNew; i++
2fc30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2fc40 70 74 72 6d 61 70 50 75 74 28 0a 09 20 20 20 20  ptrmapPut(..    
2fc50 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 61  pBt, get4byte(&a
2fc60 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
2fc70 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
2fc80 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  , apNew[i]->pgno
2fc90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2fca0 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54  ..#if 0.    /* T
2fcb0 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  he ptrmapCheckPa
2fcc0 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61  ges() contains a
2fcd0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2fce0 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20 74  ts that verify t
2fcf0 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70  hat.    ** all p
2fd00 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73  ointer map pages
2fd10 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63 74   are set correct
2fd20 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70  ly. This is help
2fd30 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a  ful while .    *
2fd40 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69  * debugging. Thi
2fd50 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73  s is usually dis
2fd60 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61 20  abled because a 
2fd70 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
2fd80 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73   may.    ** caus
2fd90 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  e an assert() st
2fda0 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e  atement to fail.
2fdb0 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43    */.    ptrmapC
2fdc0 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c  heckPages(apNew,
2fdd0 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d   nNew);.    ptrm
2fde0 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70 50  apCheckPages(&pP
2fdf0 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69  arent, 1);.#endi
2fe00 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  f.  }..  assert(
2fe10 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
2fe20 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41   );.  TRACE(("BA
2fe30 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a  LANCE: finished:
2fe40 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63   old=%d new=%d c
2fe50 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  ells=%d\n",.    
2fe60 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77        nOld, nNew
2fe70 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 0a 20 20 2f  , nCell));. .  /
2fe80 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
2fe90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2fea0 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
2feb0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
2fec0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
2fed0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
2fee0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
2fef0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2ff00 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
2ff10 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
2ff20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
2ff30 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
2ff40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2ff50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2ff60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2ff70 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f  d to copy the co
2ff80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d  ntents of the b-
2ff90 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64  tree node stored
2ffa0 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72   .** on page pFr
2ffb0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2ffc0 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61  If page pFrom wa
2ffd0 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
2ffe0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, then.** the p
2fff0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
30000 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c  es for each chil
30010 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74  d page are updat
30020 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  ed so that the.*
30030 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74  * parent page st
30040 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e  ored in the poin
30050 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20  ter map is page 
30060 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f  pTo. If pFrom co
30070 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63  ntained.** any c
30080 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c  ells with overfl
30090 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  ow page pointers
300a0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65  , then the corre
300b0 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72  sponding pointer
300c0 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
300d0 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64  are also updated
300e0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72   so that the par
300f0 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65  ent page is page
30100 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   pTo..**.** If p
30110 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  From is currentl
30120 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f  y carrying any o
30130 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65  verflow cells (e
30140 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a  ntries in the.**
30150 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d   MemPage.aOvfl[]
30160 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
30170 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
30180 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
30190 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
301a0 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
301b0 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 73 71  ialized using sq
301c0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
301d0 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ge()..**.** The 
301e0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74  performance of t
301f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30200 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74  not critical. It
30210 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
30220 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65   .** the balance
30230 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64  _shallower() and
30240 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
30250 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65  ) procedures, ne
30260 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63  ither of.** whic
30270 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74  h are called oft
30280 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20  en under normal 
30290 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a  circumstances..*
302a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
302b0 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
302c0 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
302d0 50 61 67 65 20 2a 70 54 6f 29 7b 0a 20 20 42 74  Page *pTo){.  Bt
302e0 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70  Shared * const p
302f0 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  Bt = pFrom->pBt;
30300 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46  .  u8 * const aF
30310 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
30320 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ta;.  u8 * const
30330 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
30340 61 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  a;.  int const i
30350 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
30360 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e  >hdrOffset;.  in
30370 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d  t const iToHdr =
30380 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29   ((pTo->pgno==1)
30390 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 69   ? 100 : 0);.  i
303a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
303b0 4b 3b 0a 20 20 69 6e 74 20 69 44 61 74 61 3b 0a  K;.  int iData;.
303c0 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
303d0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
303e0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
303f0 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
30400 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
30410 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
30420 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c  +5])<=pBt->usabl
30430 65 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  eSize );..  /* C
30440 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e  opy the b-tree n
30450 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ode content from
30460 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
30470 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 69 44  age pTo. */.  iD
30480 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26  ata = get2byte(&
30490 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
304a0 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54  ]);.  memcpy(&aT
304b0 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
304c0 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
304d0 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
304e0 0a 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69  .  memcpy(&aTo[i
304f0 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
30500 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
30510 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
30520 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a  pFrom->nCell);..
30530 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a    /* Reinitializ
30540 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68  e page pTo so th
30550 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
30560 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
30570 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 6d 61  tructure.  ** ma
30580 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
30590 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
305a0 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22 63 61 6e  tion of pTo "can
305b0 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73 20 74 68  not" fail, as th
305c0 65 0a 20 20 2a 2a 20 64 61 74 61 20 63 6f 70 69  e.  ** data copi
305d0 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d 20 69 73  ed from pFrom is
305e0 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76 61 6c   known to be val
305f0 69 64 2e 20 20 2a 2f 0a 20 20 70 54 6f 2d 3e 69  id.  */.  pTo->i
30600 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 54 45 53  sInit = 0;.  TES
30610 54 4f 4e 4c 59 28 72 63 20 3d 20 29 20 73 71 6c  TONLY(rc = ) sql
30620 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
30630 65 28 70 54 6f 29 3b 0a 20 20 61 73 73 65 72 74  e(pTo);.  assert
30640 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30650 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
30660 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
30670 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
30680 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
30690 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  map entries.  **
306a0 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20   for any b-tree 
306b0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
306c0 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63  s that pTo now c
306d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
306e0 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69 66  ters to. */.  if
306f0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
30700 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
30710 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b  ildPtrmaps(pTo);
30720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
30740 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
30750 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  d on the root pa
30760 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68  ge of a btree wh
30770 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  en the root.** p
30780 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
30790 63 65 6c 6c 73 2e 20 54 68 69 73 20 69 73 20 61  cells. This is a
307a0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
307b0 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a   make the tree.*
307c0 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f  * shallower by o
307d0 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ne level..*/.sta
307e0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
307f0 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67  shallower(MemPag
30800 65 20 2a 70 52 6f 6f 74 29 7b 0a 20 20 2f 2a 20  e *pRoot){.  /* 
30810 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
30820 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f   empty but has o
30830 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73  ne child.  Trans
30840 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  fer the.  ** inf
30850 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
30860 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74  at one child int
30870 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
30880 69 66 20 69 74 20 0a 20 20 2a 2a 20 77 69 6c 6c  if it .  ** will
30890 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
308a0 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
308b0 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
308c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
308d0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
308e0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
308f0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
30900 62 6c 65 20 74 68 61 6e 0a 20 20 2a 2a 20 69 74  ble than.  ** it
30910 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20  s child (due to 
30920 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65 61  the 100 byte hea
30930 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  der that occurs 
30940 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
30950 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  .  ** of the dat
30960 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69  abase fle), so i
30970 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  t might not be a
30980 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ble to hold all 
30990 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 66  of the .  ** inf
309a0 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  ormation current
309b0 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ly contained in 
309c0 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74  the child.  If t
309d0 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 2a 2a  his is the .  **
309e0 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e   case, then do n
309f0 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66  ot do the transf
30a00 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20  er.  Leave page 
30a10 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20  1 empty except. 
30a20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68   ** for the righ
30a30 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t-pointer to the
30a40 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
30a50 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63  e child page bec
30a60 6f 6d 65 73 0a 20 20 2a 2a 20 74 68 65 20 76 69  omes.  ** the vi
30a70 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
30a80 65 20 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  e tree..  */.  i
30a90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30aa0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
30ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30ac0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
30ad0 74 20 63 6f 6e 73 74 20 68 64 72 20 3d 20 70 52  t const hdr = pR
30ae0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  oot->hdrOffset; 
30af0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
30b00 65 74 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 20  et of root page 
30b10 68 65 61 64 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  header */.  MemP
30b20 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
30b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b40 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63         /* Only c
30b50 68 69 6c 64 20 6f 66 20 70 52 6f 6f 74 20 2a 2f  hild of pRoot */
30b60 0a 20 20 50 67 6e 6f 20 63 6f 6e 73 74 20 70 67  .  Pgno const pg
30b70 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
30b80 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
30b90 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
30ba0 74 2b 38 5d 29 3b 0a 20 20 0a 20 20 61 73 73 65  t+8]);.  .  asse
30bb0 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  rt( pRoot->nCell
30bc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
30bd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
30be0 65 6c 64 28 70 52 6f 6f 74 2d 3e 70 42 74 2d 3e  eld(pRoot->pBt->
30bf0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
30c00 72 74 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  rt( !pRoot->leaf
30c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
30c20 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 61  noChild>0 );.  a
30c30 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
30c40 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  <=pagerPagecount
30c50 28 70 52 6f 6f 74 2d 3e 70 42 74 29 20 29 3b 0a  (pRoot->pBt) );.
30c60 20 20 61 73 73 65 72 74 28 20 68 64 72 3d 3d 30    assert( hdr==0
30c70 20 7c 7c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d   || pRoot->pgno=
30c80 3d 31 20 29 3b 0a 20 20 0a 20 20 72 63 20 3d 20  =1 );.  .  rc = 
30c90 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
30ca0 61 67 65 28 70 52 6f 6f 74 2d 3e 70 42 74 2c 20  age(pRoot->pBt, 
30cb0 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69  pgnoChild, &pChi
30cc0 6c 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ld, 0);.  if( rc
30cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30ce0 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
30cf0 46 72 65 65 3e 3d 68 64 72 20 29 7b 0a 20 20 20  Free>=hdr ){.   
30d00 20 20 20 69 66 28 20 68 64 72 20 29 7b 0a 20 20     if( hdr ){.  
30d10 20 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61        rc = defra
30d20 67 6d 65 6e 74 50 61 67 65 28 70 43 68 69 6c 64  gmentPage(pChild
30d30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30d40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
30d60 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65   = copyNodeConte
30d70 6e 74 28 70 43 68 69 6c 64 2c 20 70 52 6f 6f 74  nt(pChild, pRoot
30d80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30da0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
30db0 20 3d 20 66 72 65 65 50 61 67 65 28 70 43 68 69   = freePage(pChi
30dc0 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ld);.      }.   
30dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
30de0 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d   The child has m
30df0 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
30e00 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  that will fit on
30e10 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20   the root..     
30e20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20   ** The tree is 
30e30 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64  already balanced
30e40 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  .  Do nothing. *
30e50 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  /.      TRACE(("
30e60 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
30e70 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  d will not fit o
30e80 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  n page 1\n", pCh
30e90 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
30ea0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
30eb0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
30ec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30ed0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30ee0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
30ef0 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  when the root pa
30f00 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73  ge of a b-tree s
30f10 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f  tructure is.** o
30f20 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65  verfull (has one
30f30 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
30f40 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20  w pages)..**.** 
30f50 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  A new child page
30f60 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
30f70 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
30f80 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
30f90 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c  ot.** page, incl
30fa0 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63  uding overflow c
30fb0 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64  ells, are copied
30fc0 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
30fd0 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   The root.** pag
30fe0 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72  e is then overwr
30ff0 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74  itten to make it
31000 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
31010 69 74 68 20 74 68 65 20 72 69 67 68 74 2d 63 68  ith the right-ch
31020 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  ild .** pointer 
31030 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
31040 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  new page..**.** 
31050 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
31060 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  , all pointer-ma
31070 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
31080 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73  ponding to pages
31090 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65   .** that the ne
310a0 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77  w child-page now
310b0 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
310c0 72 73 20 74 6f 20 61 72 65 20 75 70 64 61 74 65  rs to are update
310d0 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20  d. The.** entry 
310e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
310f0 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
31100 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
31110 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
31120 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64   is also updated
31130 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
31140 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20  ssful, *ppChild 
31150 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69  is set to contai
31160 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
31170 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70   the child .** p
31180 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
31190 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
311a0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
311b0 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72  caller is requir
311c0 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65  ed.** to call re
311d0 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a  leasePage() on *
311e0 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20  ppChild exactly 
311f0 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  once. If an erro
31200 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20  r occurs,.** an 
31210 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
31220 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68  turned and *ppCh
31230 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ild is set to 0.
31240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
31250 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65  alance_deeper(Me
31260 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65  mPage *pRoot, Me
31270 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29  mPage **ppChild)
31280 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
31290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
312b0 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
312c0 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
312d0 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20  ge *pChild = 0; 
312e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
312f0 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68  nter to a new ch
31300 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  ild page */.  Pg
31310 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20  no pgnoChild;   
31320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31330 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
31340 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
31350 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
31360 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42  *pBt = pRoot->pB
31370 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72  t;    /* The BTr
31380 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ee */..  assert(
31390 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
313a0 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  w>0 );.  assert(
313b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
313c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
313d0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52  );..  /* Make pR
313e0 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61  oot, the root pa
313f0 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
31400 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f  , writable. Allo
31410 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a  cate a new .  **
31420 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
31430 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72  become the new r
31440 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
31450 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f  age. Copy the co
31460 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74  ntents.  ** of t
31470 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f  he node stored o
31480 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65  n pRoot into the
31490 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
314a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
314b0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
314c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
314d0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 29 0a  Root->pDbPage)).
314e0 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
314f0 3d 28 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42  =(rc = allocateB
31500 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70 43  treePage(pBt,&pC
31510 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c  hild,&pgnoChild,
31520 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 29 0a  pRoot->pgno,0)).
31530 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
31540 3d 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43  =(rc = copyNodeC
31550 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43  ontent(pRoot, pC
31560 68 69 6c 64 29 29 0a 20 20 20 7c 7c 20 28 49 53  hild)).   || (IS
31570 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 0a 20  AUTOVACUUM && . 
31580 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21        SQLITE_OK!
31590 3d 28 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74  =(rc = ptrmapPut
315a0 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  (pBt, pgnoChild,
315b0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
315c0 52 6f 6f 74 2d 3e 70 67 6e 6f 29 29 29 0a 20 20  Root->pgno))).  
315d0 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20  ){.    *ppChild 
315e0 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
315f0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
31600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
31610 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31620 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
31630 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
31640 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
31650 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
31660 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e  riteable(pRoot->
31670 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
31680 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
31690 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c  ell==pRoot->nCel
316a0 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  l );..  TRACE(("
316b0 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
316c0 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
316d0 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70  , pRoot->pgno, p
316e0 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  Child->pgno));..
316f0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76    /* Copy the ov
31700 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f  erflow cells fro
31710 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c  m pRoot to pChil
31720 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43  d */.  memcpy(pC
31730 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f  hild->aOvfl, pRo
31740 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74  ot->aOvfl, pRoot
31750 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
31760 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b  of(pRoot->aOvfl[
31770 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
31780 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f  nOverflow = pRoo
31790 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20  t->nOverflow;.. 
317a0 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e   /* Zero the con
317b0 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20  tents of pRoot. 
317c0 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68  Then install pCh
317d0 69 6c 64 20 61 73 20 74 68 65 20 72 69 67 68 74  ild as the right
317e0 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72  -child. */.  zer
317f0 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68  oPage(pRoot, pCh
31800 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
31810 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75  ~PTF_LEAF);.  pu
31820 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
31830 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
31840 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
31850 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c  ild);..  *ppChil
31860 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65  d = pChild;.  re
31870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
31890 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72  e that pCur curr
318a0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
318b0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f  has just been mo
318c0 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d  dified in.** som
318d0 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63  e way. This func
318e0 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74  tion figures out
318f0 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63   if this modific
31900 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a  ation means the.
31910 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  ** tree needs to
31920 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e   be balanced, an
31930 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68  d if so calls th
31940 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
31950 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74  lancing .** rout
31960 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72  ine. Balancing r
31970 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a  outines are:.**.
31980 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69  **   balance_qui
31990 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  ck().**   balanc
319a0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 0a 2a 2a  e_shallower().**
319b0 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65     balance_deepe
319c0 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  r().**   balance
319d0 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2a 0a 2a 2a  _nonroot().**.**
319e0 20 49 66 20 62 75 69 6c 74 20 77 69 74 68 20 53   If built with S
319f0 51 4c 49 54 45 5f 44 45 42 55 47 2c 20 70 43 75  QLITE_DEBUG, pCu
31a00 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
31a10 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
31a20 69 66 20 0a 2a 2a 20 62 61 6c 61 6e 63 65 5f 73  if .** balance_s
31a30 68 61 6c 6c 6f 77 65 72 28 29 2c 20 62 61 6c 61  hallower(), bala
31a40 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6f 72 20  nce_deeper() or 
31a50 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
31a60 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
31a70 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 73 65  If none of these
31a80 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69   functions are i
31a90 6e 76 6f 6b 65 64 2c 20 70 43 75 72 2d 3e 70 61  nvoked, pCur->pa
31aa0 67 65 73 53 68 75 66 66 6c 65 64 20 69 73 20 6c  gesShuffled is l
31ab0 65 66 74 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65  eft.** unmodifie
31ac0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
31ad0 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f   balance(BtCurso
31ae0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
31af0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31b00 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e    const int nMin
31b10 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73   = pCur->pBt->us
31b20 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33  ableSize * 2 / 3
31b30 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51  ;.  u8 aBalanceQ
31b40 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20  uickSpace[13];. 
31b50 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a   u8 *pFree = 0;.
31b60 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
31b70 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63   balance_quick_c
31b80 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54  alled = 0 );.  T
31b90 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
31ba0 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
31bb0 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20  ed = 0 );..  do 
31bc0 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
31bd0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
31be0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
31bf0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
31c00 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66  [iPage];..    if
31c10 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( iPage==0 ){.  
31c20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
31c30 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
31c40 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
31c50 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
31c60 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ee is overfull. 
31c70 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 61 6c  In this case cal
31c80 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  l the.        **
31c90 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
31ca0 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72  ) function to cr
31cb0 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
31cc0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
31cd0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  ge.        ** an
31ce0 64 20 63 6f 70 79 20 74 68 65 20 63 75 72 72 65  d copy the curre
31cf0 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
31d00 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  he root-page to 
31d10 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  it. The.        
31d20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  ** next iteratio
31d30 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
31d40 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68   will balance th
31d50 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  e child page..  
31d60 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
31d70 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e    assert( (balan
31d80 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
31d90 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
31da0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
31db0 65 65 70 65 72 28 70 50 61 67 65 2c 20 26 70 43  eeper(pPage, &pC
31dc0 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a  ur->apPage[1]);.
31dd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31de0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31df0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61         pCur->iPa
31e00 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ge = 1;.        
31e10 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
31e20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31e30 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d  pCur->aiIdx[1] =
31e40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
31e50 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
31e60 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ge[1]->nOverflow
31e70 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
31e80 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
31e90 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
31ea0 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 20  led = 1 );.     
31eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31ec0 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
31ed0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69   of the b-tree i
31ee0 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 49 66 20  s now empty. If 
31ef0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  the root-page is
31f00 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
31f10 61 6c 73 6f 20 61 20 6c 65 61 66 20 70 61 67 65  also a leaf page
31f20 2c 20 69 74 20 77 69 6c 6c 20 68 61 76 65 20 61  , it will have a
31f30 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
31f40 67 65 2e 20 43 61 6c 6c 20 0a 20 20 20 20 20 20  ge. Call .      
31f50 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 73 68 61    ** balance_sha
31f60 6c 6c 6f 77 65 72 20 74 6f 20 61 74 74 65 6d 70  llower to attemp
31f70 74 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f  t to copy the co
31f80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 73 69  ntents of the si
31f90 6e 67 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ngle.        ** 
31fa0 63 68 69 6c 64 2d 70 61 67 65 20 69 6e 74 6f 20  child-page into 
31fb0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 28 74  the root page (t
31fc0 68 69 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 70  his may not be p
31fd0 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 0a 20  ossible if the. 
31fe0 20 20 20 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70         ** root p
31ff0 61 67 65 20 69 73 20 70 61 67 65 20 31 29 2e 0a  age is page 1)..
32000 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
32010 20 20 20 2a 2a 20 57 68 65 74 68 65 72 20 6f 72     ** Whether or
32020 20 6e 6f 74 20 74 68 69 73 20 69 73 20 70 6f 73   not this is pos
32030 73 69 62 6c 65 20 2c 20 74 68 65 20 74 72 65 65  sible , the tree
32040 20 69 73 20 6e 6f 77 20 62 61 6c 61 6e 63 65 64   is now balanced
32050 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  . .        ** Th
32060 65 72 65 66 6f 72 65 20 69 73 20 6e 6f 20 6e 65  erefore is no ne
32070 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
32080 74 68 65 20 64 6f 2d 6c 6f 6f 70 2e 0a 20 20 20  the do-loop..   
32090 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
320a0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
320b0 6c 3d 3d 30 20 26 26 20 21 70 50 61 67 65 2d 3e  l==0 && !pPage->
320c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
320d0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73    rc = balance_s
320e0 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b  hallower(pPage);
320f0 0a 20 20 20 20 20 20 20 20 20 20 56 56 41 5f 4f  .          VVA_O
32100 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73  NLY( pCur->pages
32110 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a  Shuffled = 1 );.
32120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
32140 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
32150 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
32160 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  =0 && pPage->nFr
32170 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20  ee<=nMin ){.    
32180 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
32190 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67  se{.      MemPag
321a0 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65 6e  e * const pParen
321b0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
321c0 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20  [iPage-1];.     
321d0 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78 20   int const iIdx 
321e0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  = pCur->aiIdx[iP
321f0 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72  age-1];..      r
32200 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32210 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70  Write(pParent->p
32220 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
32230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32240 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
32250 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
32260 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66 28  ANCE.        if(
32270 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a   pPage->hasData.
32280 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
32290 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a  e->nOverflow==1.
322a0 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
322b0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  e->aOvfl[0].idx=
322c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20  =pPage->nCell.  
322d0 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e         && pParen
322e0 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20  t->pgno!=1.     
322f0 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e      && pParent->
32300 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20  nCell==iIdx.    
32310 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
32320 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65   /* Call balance
32330 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65 61  _quick() to crea
32340 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e 67  te a new sibling
32350 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68 69   of pPage on whi
32360 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ch.          ** 
32370 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76 65  to store the ove
32380 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61  rflow cell. bala
32390 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73 65  nce_quick() inse
323a0 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20  rts a new cell. 
323b0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f           ** into
323c0 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20   pParent, which 
323d0 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e  may cause pParen
323e0 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20 74  t overflow. If t
323f0 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
32400 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e 65   happens, the ne
32410 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66  xt interation of
32420 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c   the do-loop wil
32430 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65 6e  l balance pParen
32440 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
32450 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61 6e  use either balan
32460 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20  ce_nonroot() or 
32470 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
32480 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20 20  . Until this.   
32490 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e         ** happen
324a0 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  s, the overflow 
324b0 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20 69  cell is stored i
324c0 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75  n the aBalanceQu
324d0 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20 20  ickSpace[].     
324e0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20       ** buffer. 
324f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
32500 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 70          ** The p
32510 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f  urpose of the fo
32520 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
32530 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61   is to check tha
32540 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20  t only a.       
32550 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c     ** single cal
32560 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69  l to balance_qui
32570 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f 72  ck() is made for
32580 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68   each call to th
32590 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
325a0 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
325b0 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69 66  s were not verif
325c0 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62 75  ied, a subtle bu
325d0 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73  g involving reus
325e0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  e.          ** o
325f0 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75  f the aBalanceQu
32600 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74  ickSpace[] might
32610 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20   sneak in..     
32620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32630 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e    assert( (balan
32640 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b  ce_quick_called+
32650 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  +)==0 );.       
32660 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
32670 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 70  quick(pParent, p
32680 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 75  Page, aBalanceQu
32690 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20 20  ickSpace);.     
326a0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
326b0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
326c0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
326d0 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  ase, call balanc
326e0 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72  e_nonroot() to r
326f0 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c 6c  edistribute cell
32700 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  s.          ** b
32710 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e 64  etween pPage and
32720 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73 20   up to 2 of its 
32730 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20 54  sibling pages. T
32740 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20  his involves.   
32750 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
32760 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
32770 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68 69   of pParent, whi
32780 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61  ch may cause pPa
32790 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20  rent to.        
327a0 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72    ** become over
327b0 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
327c0 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65 72  l. The next iter
327d0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
327e0 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a  loop.          *
327f0 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74  * will balance t
32800 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
32810 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e 0a  o correct this..
32820 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20            ** .  
32830 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
32840 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65  e parent page be
32850 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20  comes overfull, 
32860 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
32870 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20 20  l or cells.     
32880 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f 72       ** are stor
32890 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63 65  ed in the pSpace
328a0 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
328b0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65  d immediately be
328c0 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20 20  low. .          
328d0 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  ** A subsequent 
328e0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
328f0 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65   do-loop will de
32900 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79 0a  al with this by.
32910 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c            ** cal
32920 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ling balance_non
32930 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f  root() (balance_
32940 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65 20  deeper() may be 
32950 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20 20  called first,.  
32960 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69          ** but i
32970 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77  t doesn't deal w
32980 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ith overflow cel
32990 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20  ls - just moves 
329a0 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20 20  them to a.      
329b0 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74      ** different
329c0 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69   page). Once thi
329d0 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  s subsequent cal
329e0 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
329f0 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20 20  root() .        
32a00 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74    ** has complet
32a10 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74  ed, it is safe t
32a20 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 53  o release the pS
32a30 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64  pace buffer used
32a40 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   by.          **
32a50 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 61   the previous ca
32a60 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72 66  ll, as the overf
32a70 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77 69  low cell data wi
32a80 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20 20  ll have been .  
32a90 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
32aa0 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  d either into th
32ab0 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74 61  e body of a data
32ac0 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e 74  base page or int
32ad0 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20 20  o the new.      
32ae0 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62 75      ** pSpace bu
32af0 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 74  ffer passed to t
32b00 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20 74  he latter call t
32b10 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
32b20 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  t()..          *
32b30 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  /.          u8 *
32b40 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
32b50 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d  PageMalloc(pCur-
32b60 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
32b70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32b80 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
32b90 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20 70  pParent, iIdx, p
32ba0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
32bb0 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
32bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
32bd0 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55   pFree is not NU
32be0 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
32bf0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
32c00 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  er used .       
32c10 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65       ** by a pre
32c20 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61  vious call to ba
32c30 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
32c40 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72   Its contents ar
32c50 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
32c60 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68   now stored eith
32c70 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62  er on real datab
32c80 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74  ase pages or wit
32c90 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20  hin the .       
32ca0 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61       ** new pSpa
32cb0 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74  ce buffer, so it
32cc0 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66   may be safely f
32cd0 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20  reed here. */.  
32ce0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32cf0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
32d00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
32d10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32d20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69  pSpace buffer wi
32d30 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65  ll be freed afte
32d40 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  r the next call 
32d50 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
32d60 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
32d70 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72  ), or just befor
32d80 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
32d90 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76  returns, whichev
32da0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
32db0 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a  comes first. */.
32dc0 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20            pFree 
32dd0 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  = pSpace;.      
32de0 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43      VVA_ONLY( pC
32df0 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65  ur->pagesShuffle
32e00 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 20 20 20  d = 1 );.       
32e10 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
32e20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
32e30 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ow = 0;..      /
32e40 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61  * The next itera
32e50 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
32e60 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65  oop balances the
32e70 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f   parent page. */
32e80 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
32e90 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
32ea0 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
32eb0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
32ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32ed0 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ..  if( pFree ){
32ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
32ef0 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d  Free(pFree);.  }
32f00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32f10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
32f20 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ine checks all c
32f30 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e  ursors that poin
32f40 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52  t to table pgnoR
32f50 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  oot..** If any o
32f60 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20  f those cursors 
32f70 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
32f80 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20   wrFlag==0 in a 
32f90 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74  different.** dat
32fa0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
32fb0 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e   (a database con
32fc0 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61  nection that sha
32fd0 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  res the pager.**
32fe0 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20   cache with the 
32ff0 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
33000 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68  on) and that oth
33010 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  er connection .*
33020 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  * is not in the 
33030 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64  ReadUncommmitted
33040 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69   state, then thi
33050 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
33060 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  s .** SQLITE_LOC
33070 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65  KED..**.** As we
33080 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69  ll as cursors wi
33090 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75  th wrFlag==0, cu
330a0 72 73 6f 72 73 20 77 69 74 68 20 0a 2a 2a 20 69  rsors with .** i
330b0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d  sIncrblobHandle=
330c0 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73  =1 are also cons
330d0 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75  idered 'read' cu
330e0 72 73 6f 72 73 20 62 65 63 61 75 73 65 0a 2a 2a  rsors because.**
330f0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
33100 62 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73  b cursors are us
33110 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
33120 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
33130 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f  .**.** When pgno
33140 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74  Root is the root
33150 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b   page of an intk
33160 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66  ey table, this f
33170 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a  unction is also.
33180 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
33190 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  or invalidating 
331a0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
331b0 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68   cursors when th
331c0 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f  e table row.** o
331d0 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 72 65  n which they are
331e0 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74   opened is delet
331f0 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20  ed or modified. 
33200 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  Cursors are inva
33210 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72  lidated.** accor
33220 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ding to the foll
33230 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  owing rules:.**.
33240 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74 72  **   1) When Btr
33250 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69  eeClearTable() i
33260 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
33270 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68  letely delete th
33280 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20  e contents.**   
33290 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74     of a B-Tree t
332a0 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69  able, pExclude i
332b0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e  s set to zero an
332c0 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77  d parameter iRow
332d0 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74   is .**      set
332e0 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   to non-zero. In
332f0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69   this case all i
33300 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
33310 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20  cursors open.** 
33320 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c       on the tabl
33330 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f  e rooted at pgno
33340 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64  Root are invalid
33350 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  ated..**.**   2)
33360 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72   When BtreeInser
33370 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65  t(), BtreeDelete
33380 28 29 20 6f 72 20 42 74 72 65 65 50 75 74 44 61  () or BtreePutDa
33390 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ta() is called t
333a0 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66  o .**      modif
333b0 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69  y a table row vi
333c0 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  a an SQL stateme
333d0 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20  nt, pExclude is 
333e0 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20  set to the .**  
333f0 20 20 20 20 77 72 69 74 65 20 63 75 72 73 6f 72      write cursor
33400 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20   used to do the 
33410 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64  modification and
33420 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20   parameter iRow 
33430 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74  is set.**      t
33440 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f  o the integer ro
33450 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72  w id of the B-Tr
33460 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d  ee entry being m
33470 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a  odified. Unless.
33480 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64 65  **      pExclude
33490 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e   is itself an in
334a0 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
334b0 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20  ursor, then all 
334c0 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20  incremental.**  
334d0 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73      blob cursors
334e0 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f   open on row iRo
334f0 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  w of the B-Tree 
33500 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
33510 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62  .**.**   3) If b
33520 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64  oth pExclude and
33530 20 69 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f   iRow are set to
33540 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d   zero, no increm
33550 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20  ental blob .**  
33560 20 20 20 20 63 75 72 73 6f 72 73 20 61 72 65 20      cursors are 
33570 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
33580 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
33590 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  ForReadConflicts
335a0 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
335b0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
335c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
335d0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50   to check */.  P
335e0 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20  gno pgnoRoot,   
335f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66         /* Look f
33600 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  or read cursors 
33610 6f 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  on this btree */
33620 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
33630 63 6c 75 64 65 2c 20 20 20 20 20 2f 2a 20 49 67  clude,     /* Ig
33640 6e 6f 72 65 20 74 68 69 73 20 63 75 72 73 6f 72  nore this cursor
33650 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 20 20   */.  i64 iRow  
33660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33670 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
33680 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
33690 67 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  g */.){.  BtCurs
336a0 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65  or *p;.  BtShare
336b0 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d  d *pBt = pBtree-
336c0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
336d0 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  *db = pBtree->db
336e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
336f0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
33700 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
33710 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
33720 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
33730 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70  t){.    if( p==p
33740 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e  Exclude ) contin
33750 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ue;.    if( p->p
33760 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f  gnoRoot!=pgnoRoo
33770 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  t ) continue;.#i
33780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33790 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69  T_INCRBLOB.    i
337a0 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
337b0 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20 20 20  Handle && ( .   
337c0 20 20 20 20 20 20 28 21 70 45 78 63 6c 75 64 65        (!pExclude
337d0 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20 20 20   && iRow).      
337e0 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26 26 20  || (pExclude && 
337f0 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63  !pExclude->isInc
33800 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 70  rblobHandle && p
33810 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
33820 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  w).    )){.     
33830 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
33840 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
33850 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
33860 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  ( p->eState!=CUR
33870 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74  SOR_VALID ) cont
33880 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
33890 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e  >wrFlag==0 .#ifn
338a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
338b0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c  INCRBLOB.     ||
338c0 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61   p->isIncrblobHa
338d0 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  ndle.#endif.    
338e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
338f0 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
33900 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
33910 20 61 73 73 65 72 74 28 64 62 4f 74 68 65 72 29   assert(dbOther)
33920 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74  ;.      if( dbOt
33930 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74  her!=db && (dbOt
33940 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  her->flags & SQL
33950 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
33960 74 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ted)==0 ){.     
33970 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
33980 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 64 62 2c 20  tionBlocked(db, 
33990 64 62 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20  dbOther);.      
339a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
339b0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
339c0 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  HE;.      }.    
339d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
339e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
339f0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
33a00 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
33a10 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20  BTree.  The key 
33a20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65  is given by (pKe
33a30 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74  y,nKey).** and t
33a40 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e  he data is given
33a50 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61   by (pData,nData
33a60 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69  ).  The cursor i
33a70 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a  s used only to.*
33a80 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61  * define what ta
33a90 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73  ble the record s
33aa0 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
33ab0 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72  d into.  The cur
33ac0 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
33ad0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
33ae0 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  dom location..**
33af0 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45  .** For an INTKE
33b00 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68  Y table, only th
33b10 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20  e nKey value of 
33b20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
33b30 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
33b40 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52  ored.  For a ZER
33b50 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65  ODATA table, the
33b60 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61   pData and nData
33b70 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65   are both ignore
33b80 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
33b90 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
33ba0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
33bb0 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73  , then a success
33bc0 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73  ful call to.** s
33bd0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
33be0 6f 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73  o() to seek curs
33bf0 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79  or pCur to (pKey
33c00 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65  , nKey) has alre
33c10 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66  ady.** been perf
33c20 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c  ormed. seekResul
33c30 74 20 69 73 20 74 68 65 20 73 65 61 72 63 68 20  t is the search 
33c40 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
33c50 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e  (a negative.** n
33c60 75 6d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f  umber if pCur po
33c70 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79  ints at an entry
33c80 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72   that is smaller
33c90 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65   than (pKey, nKe
33ca0 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69  y), or.** a posi
33cb0 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43  tive value if pC
33cc0 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
33cd0 65 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72  etry that is lar
33ce0 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b  ger than .** (pK
33cf0 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a  ey, nKey)). .**.
33d00 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
33d10 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
33d20 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  s 0, then cursor
33d30 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e 74 20   pCur may point 
33d40 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79  to any .** entry
33d50 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20   or to no entry 
33d60 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20  at all. In this 
33d70 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
33d80 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a  on has to seek.*
33d90 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66  * the cursor bef
33da0 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20  ore the new key 
33db0 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e  can be inserted.
33dc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
33dd0 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74  treeInsert(.  Bt
33de0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
33df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33e00 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
33e10 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
33e20 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  is cursor */.  c
33e30 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
33e40 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
33e50 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   The key of the 
33e60 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
33e70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
33e80 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f  a, int nData,  /
33e90 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68  * The data of th
33ea0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
33eb0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
33ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
33ee0 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61  tra 0 bytes to a
33ef0 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
33f00 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61  .  int appendBia
33f10 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
33f20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
33f30 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61  s is likely an a
33f40 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73  ppend */.  int s
33f50 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20 20  eekResult       
33f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
33f70 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 71 6c  ult of prior sql
33f80 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
33f90 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  ) call */.){.  i
33fa0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63  nt rc;.  int loc
33fb0 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20   = seekResult;. 
33fc0 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e   int szNew;.  in
33fd0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
33fe0 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65   *pPage;.  Btree
33ff0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
34000 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
34010 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
34020 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
34030 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e  ldCell;.  unsign
34040 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c  ed char *newCell
34050 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
34060 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
34070 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
34080 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
34090 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
340a0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
340b0 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
340c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
340d0 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
340e0 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61  rc = checkForRea
340f0 64 43 6f 6e 66 6c 69 63 74 73 28 70 43 75 72 2d  dConflicts(pCur-
34100 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
34110 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e  gnoRoot, pCur, n
34120 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Key);.  if( rc )
34130 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  {             . 
34140 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
34150 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
34160 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
34170 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  /.    assert( rc
34180 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  ==SQLITE_LOCKED_
34190 53 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20  SHAREDCACHE );. 
341a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
341b0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
341c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
341d0 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
341e0 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
341f0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
34200 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
34210 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
34220 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
34230 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e..  **.  ** In 
34240 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
34250 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
34260 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c  treeMoveto() bel
34270 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46  ow is a no-op. F
34280 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c  or.  ** example,
34290 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
342a0 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c  data into a tabl
342b0 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65  e with auto-gene
342c0 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20  rated integer.  
342d0 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42  ** keys, the VDB
342e0 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20  E layer invokes 
342f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
34300 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
34310 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67   the .  ** integ
34320 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49  er key to use. I
34330 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69  t then calls thi
34340 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63  s function to ac
34350 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68  tually insert th
34360 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74  e .  ** data int
34370 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54  o the intkey B-T
34380 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
34390 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  e sqlite3BtreeMo
343a0 76 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65  veto() recognize
343b0 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  s.  ** that the 
343c0 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
343d0 79 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73  y where it needs
343e0 20 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72   to be and retur
343f0 6e 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  ns without.  ** 
34400 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20  doing any work. 
34410 54 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69  To avoid thwarti
34420 6e 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  ng these optimiz
34430 61 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d  ations, it is im
34440 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74  portant.  ** not
34450 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75   to clear the cu
34460 72 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  rsor here..  */.
34470 20 20 69 66 28 0a 20 20 20 20 53 51 4c 49 54 45    if(.    SQLITE
34480 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
34490 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
344a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
344b0 43 75 72 29 29 20 7c 7c 20 28 21 6c 6f 63 20 26  Cur)) || (!loc &
344c0 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  &.    SQLITE_OK!
344d0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  =(rc = sqlite3Bt
344e0 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
344f0 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
34500 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20  ndBias, &loc)). 
34510 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   )){.    return 
34520 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
34530 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
34540 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
34550 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
34560 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
34570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34580 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
34590 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
345a0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
345b0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
345c0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
345d0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
345e0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
345f0 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
34600 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
34610 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
34620 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
34630 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
34640 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
34650 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
34660 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
34670 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
34680 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
34690 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
346a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
346b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
346c0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
346d0 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
346e0 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
346f0 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
34700 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
34710 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
34720 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
34730 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
34740 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
34750 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
34760 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
34770 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
34780 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
34790 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
347a0 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
347b0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
347c0 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ate ){.    u16 s
347d0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
347e0 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
347f0 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
34800 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34810 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34820 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
34830 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
34840 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
34850 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
34860 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
34870 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
34880 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
34890 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
348a0 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
348b0 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
348c0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
348d0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
348e0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
348f0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
34900 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
34910 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
34920 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70   rc = dropCell(p
34930 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64  Page, idx, szOld
34940 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
34950 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
34960 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
34970 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rt;.    }.  }els
34980 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
34990 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
349a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
349b0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
349c0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
349d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
349e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
349f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
34a00 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
34a10 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
34a20 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
34a30 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
34a40 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
34a50 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
34a60 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
34a70 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
34a80 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
34a90 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
34aa0 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e  and pPage has an
34ab0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
34ac0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a  call balance() .
34ad0 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69    ** to redistri
34ae0 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77  bute the cells w
34af0 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20  ithin the tree. 
34b00 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20  Since balance() 
34b10 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68  may move.  ** th
34b20 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74  e cursor, zero t
34b30 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
34b40 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72  .nSize and BtCur
34b50 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20  sor.validNKey.  
34b60 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  ** variables..  
34b70 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  **.  ** Previous
34b80 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
34b90 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54  ite called moveT
34ba0 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20  oRoot() to move 
34bb0 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
34bc0 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74  back to the root
34bd0 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65   page as balance
34be0 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c  () used to inval
34bf0 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
34c00 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72  ts.  ** of BtCur
34c10 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  sor.apPage[] and
34c20 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b   BtCursor.aiIdx[
34c30 5d 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  ]. This is no lo
34c40 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 2c 0a  nger necessary,.
34c50 20 20 2a 2a 20 61 73 20 62 61 6c 61 6e 63 65 28    ** as balance(
34c60 29 20 61 6c 77 61 79 73 20 6c 65 61 76 65 73 20  ) always leaves 
34c70 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
34c80 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 65  ing to a valid e
34c90 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
34ca0 54 68 65 72 65 20 69 73 20 61 20 73 75 62 74 6c  There is a subtl
34cb0 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e 74 20  e but important 
34cc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68 65 72  optimization her
34cd0 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e 73 65  e too. When inse
34ce0 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c 74 69  rting.  ** multi
34cf0 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e 74 6f  ple records into
34d00 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   an intkey b-tre
34d10 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  e using a single
34d20 20 63 75 72 73 6f 72 20 28 61 73 20 63 61 6e 0a   cursor (as can.
34d30 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68 69 6c    ** happen whil
34d40 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  e processing an 
34d50 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e  "INSERT INTO ...
34d60 20 53 45 4c 45 43 54 22 20 73 74 61 74 65 6d 65   SELECT" stateme
34d70 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  nt), it.  ** is 
34d80 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74 6f 20  advantageous to 
34d90 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72  leave the cursor
34da0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
34db0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 0a 20   last entry in. 
34dc0 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 69   ** the b-tree i
34dd0 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66 20 74  f possible. If t
34de0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
34df0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
34e00 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e 74 72  e last.  ** entr
34e10 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  y in the table, 
34e20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  and the next row
34e30 20 69 6e 73 65 72 74 65 64 20 68 61 73 20 61 6e   inserted has an
34e40 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20 20 2a   integer key.  *
34e50 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  * larger than th
34e60 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69  e largest existi
34e70 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20 70 6f  ng key, it is po
34e80 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65 72 74  ssible to insert
34e90 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 77 69   the.  ** row wi
34ea0 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20 74 68  thout seeking th
34eb0 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20 63  e cursor. This c
34ec0 61 6e 20 62 65 20 61 20 62 69 67 20 70 65 72 66  an be a big perf
34ed0 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
34ee0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   */.  pCur->info
34ef0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
34f00 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
34f10 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
34f20 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
34f30 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
34f40 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
34f50 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   0;.    rc = bal
34f60 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20  ance(pCur);..   
34f70 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
34f80 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
34f90 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
34fa0 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
34fb0 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73  e().    ** fails
34fc0 2e 20 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61  .  Internal data
34fd0 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
34fe0 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ption will resul
34ff0 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a  t otherwise. */.
35000 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
35010 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
35020 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
35030 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
35040 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
35050 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Page]->nOverflow
35060 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65  ==0 );..end_inse
35070 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rt:.  return rc;
35080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
35090 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
350a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
350b0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
350c0 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
350d0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
350e0 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69  arbitrary locati
350f0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
35100 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74  e3BtreeDelete(Bt
35110 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
35120 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
35130 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
35140 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
35150 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
35160 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20   .  int rc;     
35170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35180 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35190 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
351a0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
351b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351c0 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65 6c    /* Page to del
351d0 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f  ete cell from */
351e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
351f0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
35200 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
35210 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64 65  er to cell to de
35220 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  lete */.  int iC
35230 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20 20  ellIdx;         
35240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35250 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
35260 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
35270 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20 20  nt iCellDepth;  
35280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35290 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20      /* Depth of 
352a0 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  node containing 
352b0 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73 73  pCell */ ..  ass
352c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
352d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
352e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
352f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
35300 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
35310 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
35320 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74  Only );.  assert
35330 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
35340 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
35350 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
35360 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70  iPage]>=pCur->ap
35370 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
35380 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20 7c 7c  ]->nCell) .   ||
35390 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74   NEVER(pCur->eSt
353a0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
353b0 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  D).  ){.    retu
353c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
353d0 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68    /* Something h
353e0 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20 2a 2f  as gone awry. */
353f0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 63 68 65  .  }..  rc = che
35400 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63  ckForReadConflic
35410 74 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  ts(p, pCur->pgno
35420 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72  Root, pCur, pCur
35430 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  ->info.nKey);.  
35440 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35450 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
35460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
35470 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  ED_SHAREDCACHE )
35480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
35490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
354a0 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
354b0 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
354c0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
354d0 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70    iCellDepth = p
354e0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43  Cur->iPage;.  iC
354f0 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61  ellIdx = pCur->a
35500 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d  iIdx[iCellDepth]
35510 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
35520 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65  ->apPage[iCellDe
35530 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  pth];.  pCell = 
35540 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
35550 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a  iCellIdx);..  /*
35560 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   If the page con
35570 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72  taining the entr
35580 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e  y to delete is n
35590 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
355a0 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75  move.  ** the cu
355b0 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67  rsor to the larg
355c0 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  est entry in the
355d0 20 74 72 65 65 20 74 68 61 74 20 69 73 20 73 6d   tree that is sm
355e0 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  aller than.  ** 
355f0 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20  the entry being 
35600 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65  deleted. This ce
35610 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20  ll will replace 
35620 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64  the cell being d
35630 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d  eleted.  ** from
35640 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
35650 64 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75  de. The 'previou
35660 73 27 20 65 6e 74 72 79 20 69 73 20 75 73 65 64  s' entry is used
35670 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61   for this instea
35680 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e  d.  ** of the 'n
35690 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74  ext' entry, as t
356a0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
356b0 79 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 61  y is always a pa
356c0 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
356d0 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 20 62  ub-tree headed b
356e0 79 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  y the child page
356f0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69   of the cell bei
35700 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73  ng deleted. This
35710 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61   makes.  ** bala
35720 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65 20 66  ncing the tree f
35730 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c  ollowing the del
35740 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61  ete operation ea
35750 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  sier.  */.  if( 
35760 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
35770 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b      int notUsed;
35780 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
35790 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
357a0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
357b0 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 29 20  Cur, &notUsed)) 
357c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
357d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
357e0 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
357f0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
35800 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
35810 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62   on this table b
35820 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e  efore.  ** makin
35830 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  g any modificati
35840 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  ons. Make the pa
35850 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
35860 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20  e entry to be . 
35870 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74   ** deleted writ
35880 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20  able. Then free 
35890 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
358a0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
358b0 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74  th the .  ** ent
358c0 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72  ry and finally r
358d0 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69  emove the cell i
358e0 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69  tself from withi
358f0 6e 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a  n the page.  */.
35900 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
35910 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
35920 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
35930 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
35940 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
35950 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
35960 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
35970 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c  ->pDbPage)).   |
35980 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
35990 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
359a0 67 65 2c 20 70 43 65 6c 6c 29 29 0a 20 20 20 7c  ge, pCell)).   |
359b0 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
359c0 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67   = dropCell(pPag
359d0 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63 65 6c  e, iCellIdx, cel
359e0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
359f0 70 43 65 6c 6c 29 29 29 0a 20 20 29 7b 0a 20 20  pCell))).  ){.  
35a00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
35a10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65  ..  /* If the ce
35a20 6c 6c 20 64 65 6c 65 74 65 64 20 77 61 73 20 6e  ll deleted was n
35a30 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  ot located on a 
35a40 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 20  leaf page, then 
35a50 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
35a60 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
35a70 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72  nting to the lar
35a80 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  gest entry in th
35a90 65 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65  e sub-tree heade
35aa0 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 68  d.  ** by the ch
35ab0 69 6c 64 2d 70 61 67 65 20 6f 66 20 74 68 65 20  ild-page of the 
35ac0 63 65 6c 6c 20 74 68 61 74 20 77 61 73 20 6a 75  cell that was ju
35ad0 73 74 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  st deleted from 
35ae0 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a  an internal.  **
35af0 20 6e 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c 20   node. The cell 
35b00 66 72 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f  from the leaf no
35b10 64 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d  de needs to be m
35b20 6f 76 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  oved to the inte
35b30 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74  rnal.  ** node t
35b40 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 64 65  o replace the de
35b50 6c 65 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a  leted cell.  */.
35b60 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
35b70 61 66 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  af ){.    MemPag
35b80 65 20 2a 70 4c 65 61 66 20 3d 20 70 43 75 72 2d  e *pLeaf = pCur-
35b90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
35ba0 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43  age];.    int nC
35bb0 65 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20  ell;.    Pgno n 
35bc0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
35bd0 43 65 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67  CellDepth+1]->pg
35be0 6e 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  no;.    unsigned
35bf0 20 63 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20   char *pTmp;..  
35c00 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
35c10 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d  ll(pLeaf, pLeaf-
35c20 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e  >nCell-1);.    n
35c30 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
35c40 74 72 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29  tr(pLeaf, pCell)
35c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 58  ;.    assert( MX
35c60 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e  _CELL_SIZE(pBt)>
35c70 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61  =nCell );..    a
35c80 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
35c90 28 70 42 74 29 3b 0a 20 20 20 20 70 54 6d 70 20  (pBt);.    pTmp 
35ca0 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
35cb0 3b 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ;..    if( SQLIT
35cc0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
35cd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
35ce0 65 61 66 2d 3e 70 44 62 50 61 67 65 29 29 20 0a  eaf->pDbPage)) .
35cf0 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
35d00 4b 21 3d 28 72 63 20 3d 20 69 6e 73 65 72 74 43  K!=(rc = insertC
35d10 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
35d20 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43  Idx, pCell-4, nC
35d30 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 29 29  ell+4, pTmp, n))
35d40 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
35d50 4f 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70 43 65  OK!=(rc = dropCe
35d60 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d  ll(pLeaf, pLeaf-
35d70 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 29  >nCell-1, nCell)
35d80 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
35d90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
35da0 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63    }..  /* Balanc
35db0 65 20 74 68 65 20 74 72 65 65 2e 20 49 66 20 74  e the tree. If t
35dc0 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64  he entry deleted
35dd0 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20   was located on 
35de0 61 20 6c 65 61 66 20 70 61 67 65 2c 0a 20 20 2a  a leaf page,.  *
35df0 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  * then the curso
35e00 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  r still points t
35e10 6f 20 74 68 61 74 20 70 61 67 65 2e 20 49 6e 20  o that page. In 
35e20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
35e30 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f  rst.  ** call to
35e40 20 62 61 6c 61 6e 63 65 28 29 20 72 65 70 61 69   balance() repai
35e50 72 73 20 74 68 65 20 74 72 65 65 2c 20 61 6e 64  rs the tree, and
35e60 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e   the if(...) con
35e70 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e  dition is.  ** n
35e80 65 76 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a  ever true..  **.
35e90 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
35ea0 69 66 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c  if the entry del
35eb0 65 74 65 64 20 77 61 73 20 6f 6e 20 61 6e 20 69  eted was on an i
35ec0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67  nternal node pag
35ed0 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75  e, then.  ** pCu
35ee0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
35ef0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66   the leaf page f
35f00 72 6f 6d 20 77 68 69 63 68 20 61 20 63 65 6c 6c  rom which a cell
35f10 20 77 61 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a   was removed to.
35f20 20 20 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65    ** replace the
35f30 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 66 72   cell deleted fr
35f40 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
35f50 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c  node. This is sl
35f60 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63  ightly.  ** tric
35f70 6b 79 20 61 73 20 74 68 65 20 6c 65 61 66 20 6e  ky as the leaf n
35f80 6f 64 65 20 6d 61 79 20 62 65 20 75 6e 64 65 72  ode may be under
35f90 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e  full, and the in
35fa0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a  ternal node may.
35fb0 20 20 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75    ** be either u
35fc0 6e 64 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c  nder or overfull
35fd0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
35fe0 75 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  un the balancing
35ff0 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20   algorithm.  ** 
36000 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  on the leaf node
36010 20 66 69 72 73 74 2e 20 49 66 20 74 68 65 20 62   first. If the b
36020 61 6c 61 6e 63 65 20 70 72 6f 63 65 65 64 73 20  alance proceeds 
36030 66 61 72 20 65 6e 6f 75 67 68 20 75 70 20 74 68  far enough up th
36040 65 0a 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74  e.  ** tree that
36050 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20   we can be sure 
36060 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d  that any problem
36070 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   in the internal
36080 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20 62   node has.  ** b
36090 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c 20 73  een corrected, s
360a0 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72 77 69  o be it. Otherwi
360b0 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61 6e 63  se, after balanc
360c0 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e 6f 64  ing the leaf nod
360d0 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65  e,.  ** walk the
360e0 20 63 75 72 73 6f 72 20 75 70 20 74 68 65 20 74   cursor up the t
360f0 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ree to the inter
36100 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c  nal node and bal
36110 61 6e 63 65 20 69 74 20 61 73 20 0a 20 20 2a 2a  ance it as .  **
36120 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20   well.  */.  rc 
36130 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
36140 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36150 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69 50  E_OK && pCur->iP
36160 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29  age>iCellDepth )
36170 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
36180 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65  r->iPage>iCellDe
36190 70 74 68 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  pth ){.      rel
361a0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
361b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
361c0 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e--]);.    }.   
361d0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
361e0 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
361f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36200 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
36210 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pCur);.  }.  ret
36220 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36230 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54   Create a new BT
36240 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74  ree table.  Writ
36250 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20  e into *piTable 
36260 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
36270 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  er for the root 
36280 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
36290 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
362a0 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73   type of type is
362b0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
362c0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
362d0 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a  er.  Only the.**
362e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
362f0 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63  s of flags are c
36300 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e  urrently in use.
36310 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66    Other values f
36320 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68  or.** flags migh
36330 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a  t not work:.**.*
36340 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b  *     BTREE_INTK
36350 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54  EY|BTREE_LEAFDAT
36360 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53  A     Used for S
36370 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72  QL tables with r
36380 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20  owid keys.**    
36390 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20   BTREE_ZERODATA 
363a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363b0 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e   Used for SQL in
363c0 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  dices.*/.static 
363d0 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54  int btreeCreateT
363e0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
363f0 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74  nt *piTable, int
36400 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61   flags){.  BtSha
36410 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
36420 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  t;.  MemPage *pR
36430 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  oot;.  Pgno pgno
36440 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Root;.  int rc;.
36450 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36460 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
36470 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
36480 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
36490 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
364a0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  E );.  assert( !
364b0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
364c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
364d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
364e0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
364f0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
36500 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
36510 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   1, 0);.  if( rc
36520 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
36530 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  c;.  }.#else.  i
36540 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
36550 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
36560 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a  gnoMove;      /*
36570 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72   Move a page her
36580 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  e to make room f
36590 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
365a0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
365b0 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54  *pPageMove; /* T
365c0 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  he page to move 
365d0 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  to. */..    /* C
365e0 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  reating a new ta
365f0 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79  ble may probably
36600 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
36610 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  an existing data
36620 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  base.    ** to m
36630 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
36640 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74   new tables root
36650 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74   page. In case t
36660 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20  his page turns. 
36670 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20     ** out to be 
36680 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
36690 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65  , delete all ove
366a0 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63  rflow page-map c
366b0 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c  aches.    ** hel
366c0 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72  d by open cursor
366d0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  s..    */.    in
366e0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
366f0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a  lowCache(pBt);..
36700 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
36710 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d  value of meta[3]
36720 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
36730 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  se to determine 
36740 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  where the.    **
36750 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
36760 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75  e new table shou
36770 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69  ld go. meta[3] i
36780 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  s the largest ro
36790 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63  ot-page.    ** c
367a0 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73  reated so far, s
367b0 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  o the new root-p
367c0 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b  age is (meta[3]+
367d0 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  1)..    */.    r
367e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
367f0 47 65 74 4d 65 74 61 28 70 2c 20 42 54 52 45 45  GetMeta(p, BTREE
36800 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41  _LARGEST_ROOT_PA
36810 47 45 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a  GE, &pgnoRoot);.
36820 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
36840 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
36850 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
36860 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
36870 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
36880 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
36890 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
368a0 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
368b0 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
368c0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
368d0 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f    while( pgnoRoo
368e0 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
368f0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
36900 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
36910 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
36920 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
36930 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
36940 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
36950 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
36960 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
36970 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
36980 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
36990 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
369a0 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
369b0 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
369c0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
369d0 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
369e0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
369f0 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
36a00 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
36a10 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
36a20 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
36a30 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
36a40 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
36a50 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
36a60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
36a80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
36a90 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
36aa0 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
36ab0 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74       /* pgnoRoot
36ac0 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
36ad0 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
36ae0 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
36af0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
36b00 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75   new table (assu
36b10 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69  ming an error di
36b20 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75  d not occur). Bu
36b30 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20  t we were.      
36b40 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e  ** allocated pgn
36b50 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72  oMove. If requir
36b60 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77  ed (i.e. if it w
36b70 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  as not allocated
36b80 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74  .      ** by ext
36b90 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29  ending the file)
36ba0 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  , the current pa
36bb0 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70  ge at position p
36bc0 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a  gnoMove.      **
36bd0 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72   is already jour
36be0 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  naled..      */.
36bf0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
36c00 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50        Pgno iPtrP
36c10 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65  age;..      rele
36c20 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76  asePage(pPageMov
36c30 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f  e);..      /* Mo
36c40 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72  ve the page curr
36c50 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f  ently at pgnoRoo
36c60 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a  t to pgnoMove. *
36c70 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
36c80 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
36c90 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
36ca0 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
36cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
36cd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36ce0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
36cf0 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
36d00 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
36d10 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
36d20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
36d30 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
36d40 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
36d50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
36d60 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
36d70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
36d80 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
36d90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
36da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
36db0 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
36dc0 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
36dd0 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
36de0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
36df0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
36e00 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
36e10 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
36e20 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30  age, pgnoMove, 0
36e30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
36e40 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20  Page(pRoot);..  
36e50 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68      /* Obtain th
36e60 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f  e page at pgnoRo
36e70 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
36e80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36e90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
36ea0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
36eb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
36ec0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
36ed0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
36ee0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
36ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36f00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
36f10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
36f20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36f30 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
36f40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
36f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
36f60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
36f70 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
36f80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
36f90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
36fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
36fb0 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
36fc0 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
36fd0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
36fe0 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
36ff0 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
37000 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
37010 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
37020 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
37030 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
37040 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
37050 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
37060 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
37070 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
37080 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
37090 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
370a0 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
370b0 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
370c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
370d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
370e0 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
370f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
37100 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
37110 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
37120 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
37130 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
37140 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
37150 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
37160 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
37170 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37180 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
37190 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
371a0 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
371b0 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
371c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
371d0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
371e0 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
371f0 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
37200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37210 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
37220 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
37230 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
37240 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
37250 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
37260 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
37270 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
37280 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c  eeCreateTable(p,
37290 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   piTable, flags)
372a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
372b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
372c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
372d0 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20  Erase the given 
372e0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e  database page an
372f0 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72  d all its childr
37300 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  en.  Return.** t
37310 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
37320 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  reelist..*/.stat
37330 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61  ic int clearData
37340 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68  basePage(.  BtSh
37350 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
37360 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
37370 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
37380 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  the table */.  P
37390 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
373a0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
373b0 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a  ber to clear */.
373c0 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
373d0 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag,     /* Deall
373e0 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
373f0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  ue */.  int *pnC
37400 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61  hange.){.  MemPa
37410 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
37420 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
37430 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
37440 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
37450 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
37460 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
37470 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
37480 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
37490 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
374a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
374b0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
374c0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
374d0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26  age(pBt, pgno, &
374e0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
374f0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
37500 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
37510 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
37520 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
37530 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
37540 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
37550 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
37560 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
37570 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
37580 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
37590 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e  te(pCell), 1, pn
375a0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 69  Change);.      i
375b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
375c0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
375d0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
375e0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
375f0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
37600 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
37610 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
37620 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  out;.  }.  if( !
37630 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
37640 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
37650 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
37660 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
37670 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e  aData[8]), 1, pn
37680 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66 28  Change);.    if(
37690 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
376a0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
376b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e  ;.  }else if( pn
376c0 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61 73  Change ){.    as
376d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
376e0 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68  Key );.    *pnCh
376f0 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e  ange += pPage->n
37700 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Cell;.  }.  if( 
37710 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a  freePageFlag ){.
37720 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
37730 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
37740 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69  e if( (rc = sqli
37750 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
37760 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d  age->pDbPage))==
37770 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67  0 ){.    zeroPag
37780 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
37790 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c  aData[0] | PTF_L
377a0 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72  EAF);.  }..clear
377b0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
377c0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
377d0 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
377e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
377f0 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  lete all informa
37800 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67  tion from a sing
37810 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
37820 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c  database.  iTabl
37830 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  e is.** the page
37840 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
37850 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
37860 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
37870 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a  utine returns,.*
37880 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
37890 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74  is empty, but st
378a0 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a  ill exists..**.*
378b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
378c0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
378d0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
378e0 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
378f0 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72  n.** read cursor
37900 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s on the table. 
37910 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73   Open write curs
37920 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  ors are moved to
37930 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20   the.** root of 
37940 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
37950 20 49 66 20 70 6e 43 68 61 6e 67 65 20 69 73 20   If pnChange is 
37960 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
37970 61 62 6c 65 20 69 54 61 62 6c 65 20 6d 75 73 74  able iTable must
37980 20 62 65 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   be an intkey ta
37990 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ble. The.** inte
379a0 67 65 72 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ger value pointe
379b0 64 20 74 6f 20 62 79 20 70 6e 43 68 61 6e 67 65  d to by pnChange
379c0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
379d0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
379e0 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74  .** entries in t
379f0 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  he table..*/.int
37a00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
37a10 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  arTable(Btree *p
37a20 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
37a30 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20  t *pnChange){.  
37a40 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
37a50 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
37a60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
37a70 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
37a80 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
37a90 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
37aa0 20 69 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b   if( (rc = check
37ab0 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  ForReadConflicts
37ac0 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31  (p, iTable, 0, 1
37ad0 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
37ae0 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20  .    /* nothing 
37af0 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65  to do */.  }else
37b00 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
37b10 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
37b20 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65  sors(pBt, iTable
37b30 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  , 0)) ){.    /* 
37b40 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f  nothing to do */
37b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
37b60 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
37b70 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
37b80 69 54 61 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61  iTable, 0, pnCha
37b90 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nge);.  }.  sqli
37ba0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
37bb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37bc0 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
37bd0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  l information in
37be0 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64   a table and add
37bf0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
37c00 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65   table to.** the
37c10 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65   freelist.  Exce
37c20 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  pt, the root of 
37c30 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61  the principle ta
37c40 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a  ble (the one on.
37c50 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65  ** page 1) is ne
37c60 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65  ver added to the
37c70 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
37c80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
37c90 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
37ca0 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
37cb0 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
37cc0 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  .** cursors on t
37cd0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
37ce0 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
37cf0 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65   enabled and the
37d00 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20   page at iTable 
37d10 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
37d20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  ** root page in 
37d30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37d40 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  e, then the last
37d50 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69   root page .** i
37d60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
37d70 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74  ile is moved int
37d80 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65  o the slot forme
37d90 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a  rly occupied by.
37da0 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68  ** iTable and th
37db0 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72  at last slot for
37dc0 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
37dd0 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  y the last root 
37de0 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64  page.** is added
37df0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
37e00 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62   instead of iTab
37e10 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79  le.  In this say
37e20 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61  , all.** root pa
37e30 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20  ges are kept at 
37e40 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
37e50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37e60 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  le, which.** is 
37e70 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55  necessary for AU
37e80 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b  TOVACUUM to work
37e90 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65   right.  *piMove
37ea0 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
37eb0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
37ec0 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20  that used to be 
37ed0 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
37ee0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62  ge in the file b
37ef0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76  efore.** the mov
37f00 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67  e.  If no page g
37f10 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f  ets moved, *piMo
37f20 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ved is set to 0.
37f30 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f  .** The last roo
37f40 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64  t page is record
37f50 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e  ed in meta[3] an
37f60 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
37f70 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64  * meta[3] is upd
37f80 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  ated by this pro
37f90 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  cedure..*/.stati
37fa0 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54  c int btreeDropT
37fb0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50  able(Btree *p, P
37fc0 67 6e 6f 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  gno iTable, int 
37fd0 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  *piMoved){.  int
37fe0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
37ff0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53  pPage = 0;.  BtS
38000 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
38010 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
38020 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
38030 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
38040 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
38050 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
38060 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  ;..  /* It is il
38070 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20  legal to drop a 
38080 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
38090 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
380a0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
380b0 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
380c0 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
380d0 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
380e0 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
380f0 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65  d to move anothe
38100 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66  r root-page to f
38110 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62  ill a gap left b
38120 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20  y the deleted.  
38130 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66  ** root page. If
38140 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
38150 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70  was using this p
38160 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
38170 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e  uld .  ** occur.
38180 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
38190 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
381a0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
381b0 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
381c0 70 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42  pBt->pCursor->pB
381d0 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 72  tree->db);.    r
381e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
381f0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
38200 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
38210 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
38220 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
38230 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  le, &pPage, 0);.
38240 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
38250 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
38260 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
38270 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  ble(p, iTable, 0
38280 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
38290 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
382a0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
382b0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69  n rc;.  }..  *pi
382c0 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Moved = 0;..  if
382d0 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69  ( iTable>1 ){.#i
382e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
382f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
38300 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
38310 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  age);.    releas
38320 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65  ePage(pPage);.#e
38330 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d  lse.    if( pBt-
38340 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
38350 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f       Pgno maxRoo
38360 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  tPgno;.      rc 
38370 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
38380 74 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c  tMeta(p, BTREE_L
38390 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45  ARGEST_ROOT_PAGE
383a0 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  , &maxRootPgno);
383b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
383c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
383d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
383e0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
383f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
38400 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54   }..      if( iT
38410 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e  able==maxRootPgn
38420 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
38430 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  If the table bei
38440 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68  ng dropped is th
38450 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
38460 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
38470 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
38480 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
38490 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f  base, put the ro
384a0 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66  ot page on the f
384b0 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ree list. .     
384c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
384d0 20 3d 20 66 72 65 65 50 61 67 65 28 7