/ Hex Artifact Content
Login

Artifact 5d4e1fdae7c765b6a04b086545357bc93d7d6a63:


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 33 20 32 30 30 39 2f 30  c,v 1.633 2009/0
0190: 36 2f 31 37 20 31 33 3a 30 39 3a 33 39 20 64 72  6/17 13:09:39 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 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int 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 70 42 74 2d 3e 75 73 61 62 6c  if( k>pBt->usabl
22e80 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
22e90 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
22ea0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
22eb0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
22ec0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
22ed0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22ee0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22ef0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
22f00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
22f10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22f20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
22f30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
22f40 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
22f50 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
22f60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
22f70 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
22f80 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
22f90 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
22fa0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
22fb0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
22fc0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
22fd0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
22fe0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22ff0 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
23000 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
23010 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
23020 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
23030 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
23040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
23050 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23060 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
23070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
23080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
23090 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
230a0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
230b0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
230c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
230d0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
230e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
230f0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
23100 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
23110 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
23120 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23130 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
23140 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
23150 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
23160 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
23170 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23180 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23190 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
231a0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
231b0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
231c0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
231d0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
231e0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
231f0 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
23200 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
23210 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
23220 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
23230 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
23240 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23250 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
23260 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
23270 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
23280 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
23290 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
232a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
232b0 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
232c0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
232d0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
232e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
232f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
23300 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
23310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
23330 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
23340 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
23350 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
23360 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23380 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
23390 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
233a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
233b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
233c0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
233d0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
233e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
233f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23400 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
23410 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
23420 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
23430 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
23440 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
23450 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
23460 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
23470 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
23480 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
23490 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
234a0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
234b0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
234c0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
234d0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
234e0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
234f0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
23500 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
23510 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
23520 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
23530 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
23540 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
23550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23560 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
23570 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
23580 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
23590 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
235a0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
235b0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
235c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
235d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
235e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
235f0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
23600 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
23610 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
23620 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
23630 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
23640 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23650 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
23660 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
23670 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
23680 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
23690 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
236a0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
236b0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
236c0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
236d0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
236e0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
236f0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
23700 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
23710 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
23720 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
23730 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
23740 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  k */.        int
23750 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
23760 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
23770 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
23780 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
23790 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
237a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
237b0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
237c0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
237d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
237e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
237f0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
23800 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23810 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
23820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
23830 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20   i, dist;.      
23840 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
23850 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
23860 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
23870 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
23880 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
23890 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
238a0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
238b0 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
238c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
238d0 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
238e0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
238f0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
23900 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
23910 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
23920 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
23930 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
23940 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
23950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
23960 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
23970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23980 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
23990 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
239a0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
239b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
239c0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
239d0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
239e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
239f0 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
23a00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23a10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23a20 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
23a30 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
23a40 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
23a50 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
23a60 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
23a70 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
23a80 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
23a90 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ent;.          P
23aa0 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  gno nPage;.     
23ab0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
23ac0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  age;.          n
23ad0 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
23ae0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
23af0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
23b00 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
23b10 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
23b20 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
23b30 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
23b40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23b50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23b60 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
23b70 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
23b80 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
23b90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
23ba0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
23bb0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
23bc0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
23bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23be0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
23bf0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
23c10 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
23c20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
23c30 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
23c40 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
23c50 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
23c60 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
23c70 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
23c80 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
23c90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23ca0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
23cb0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
23cc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23cd0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
23ce0 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b  writeable(pTrunk
23cf0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
23d00 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
23d10 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
23d20 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
23d30 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
23d40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23d50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
23d60 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
23d70 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
23d80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23d90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23da0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23db0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
23dc0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
23dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23de0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23df0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23e00 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
23e10 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
23e20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
23e30 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
23e40 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
23e50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23e60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
23e70 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
23e80 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
23e90 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
23ea0 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
23eb0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
23ec0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
23ed0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
23ee0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
23ef0 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
23f00 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
23f10 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  e */.    int nPa
23f20 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
23f30 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  unt(pBt);.    *p
23f40 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31  Pgno = nPage + 1
23f50 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e  ;..    if( *pPgn
23f60 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
23f70 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
23f80 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
23f90 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
23fa0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23fb0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
23fc0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
23fd0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
23fe0 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
23ff0 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
24000 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
24010 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
24020 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
24030 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
24040 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
24050 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
24060 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
24070 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
24080 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
24090 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
240a0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
240b0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
240c0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
240d0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
240e0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
240f0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
24100 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
24110 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
24120 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70  map page)\n", *p
24130 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73  Pgno));.      as
24140 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
24150 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
24160 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
24170 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
24180 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
24190 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  no, &pPg, 0);.  
241a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
241b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
241c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
241d0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
241e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
241f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
24200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24210 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
24220 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  c;.      (*pPgno
24230 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  )++;.      if( *
24240 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
24250 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
24260 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20   (*pPgno)++; }. 
24270 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
24280 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
24290 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
242a0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
242b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
242c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
242d0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
242e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
242f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
24300 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24310 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
24320 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
24330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24340 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
24350 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
24360 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
24370 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
24380 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
24390 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
243a0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
243b0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
243c0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
243d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
243e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
243f0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
24400 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
24410 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24430 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
24440 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
24450 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
24460 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
24470 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
24480 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24490 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
244a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
244b0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
244c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
244d0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
244e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
244f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24500 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
24510 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
24520 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
24530 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
24540 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
24550 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
24560 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
24570 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
24580 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
24590 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
245a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
245b0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
245c0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
245d0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
245e0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
245f0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
24600 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
24610 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
24620 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
24630 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
24640 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
24650 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
24660 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
24670 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
24680 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
24690 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
246a0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
246b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
246c0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
246d0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
246e0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
246f0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
24700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
24710 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
24720 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
24730 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
24740 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
24750 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24770 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
24780 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
24790 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
247b0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
247c0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
247d0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
247e0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
247f0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
24800 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
24810 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
24820 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24840 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
24850 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
24860 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
24870 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
248a0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
248d0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
248e0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
248f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
24900 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
24910 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
24920 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
24930 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
24940 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
24950 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
24960 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
24970 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
24980 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
24990 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
249a0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
249b0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
249c0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
249d0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
249e0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
249f0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
24a00 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
24a10 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
24a20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24a30 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
24a40 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
24a50 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
24a60 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
24a70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
24a80 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
24a90 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
24aa0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
24ab0 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
24ac0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
24ad0 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
24ae0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
24af0 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
24b00 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
24b10 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
24b20 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
24b30 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
24b40 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
24b50 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  os..  */.  if( (
24b60 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20  !pPage && (rc = 
24b70 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
24b80 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
24b90 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20  &pPage, 0))).   
24ba0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72  ||            (r
24bb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24bc0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
24bd0 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Page)).  ){.    
24be0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
24bf0 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  t;.  }.  memset(
24c00 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
24c10 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
24c20 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
24c30 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
24c40 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
24c50 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
24c60 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
24c70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
24c80 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
24c90 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
24ca0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
24cb0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
24cc0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
24cd0 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
24ce0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
24cf0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
24d00 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
24d10 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
24d20 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
24d30 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
24d40 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
24d50 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
24d60 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
24d70 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
24d80 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
24d90 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
24da0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
24db0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
24dc0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
24dd0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
24de0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
24df0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
24e00 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
24e10 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
24e20 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
24e30 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
24e40 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
24e50 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
24e60 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
24e70 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
24e80 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
24e90 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
24ea0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
24eb0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
24ec0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
24ed0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66  ){.    int nLeaf
24ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ef0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
24f00 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
24f10 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
24f20 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
24f30 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
24f40 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
24f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
24f60 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24f70 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
24f80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
24f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24fa0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
24fb0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
24fc0 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
24fd0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
24fe0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  a[4]);.    if( n
24ff0 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20  Leaf<0 ){.      
25000 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
25010 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
25020 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
25030 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
25040 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62   nLeaf<pBt->usab
25050 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
25060 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
25070 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
25080 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
25090 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
250a0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
250b0 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
250c0 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
250d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
250e0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
250f0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
25100 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
25110 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
25120 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
25130 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
25140 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
25150 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
25160 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
25170 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
25180 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
25190 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
251a0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
251b0 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
251c0 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
251d0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
251e0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
251f0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
25200 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
25210 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
25220 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
25230 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
25240 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
25250 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
25260 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
25270 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
25280 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
25290 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
252a0 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63  ntain to restric
252b0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
252c0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
252d0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
252e0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
252f0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
25300 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
25310 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
25320 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
25330 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
25340 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
25350 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
25360 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
25370 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
25380 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
25390 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
253a0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
253b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
253c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
253d0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
253e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
253f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25400 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
25410 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
25420 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
25430 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
25440 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
25450 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
25460 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  Page);.#ifndef S
25470 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
25480 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  ETE.        if( 
25490 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
254a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
254b0 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
254c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
254d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
254e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
254f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
25500 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
25510 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
25520 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
25530 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
25540 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
25550 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
25560 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
25570 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
25580 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
25590 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
255a0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
255b0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
255c0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
255d0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
255e0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
255f0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
25600 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
25610 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
25620 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
25630 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
25640 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
25650 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
25660 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
25670 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
25680 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
25690 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
256a0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
256b0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
256c0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
256d0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
256e0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
256f0 20 20 69 66 28 20 20 20 28 28 21 70 50 61 67 65    if(   ((!pPage
25700 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
25710 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
25720 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
25730 20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20   &pPage, 0)))). 
25740 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63      || (0 != (rc
25750 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25760 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
25770 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  age))).  ){.    
25780 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
25790 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
257a0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
257b0 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
257c0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
257d0 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
257e0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
257f0 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
25800 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
25810 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
25820 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
25830 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
25840 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
25850 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
25860 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
25870 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
25880 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
25890 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
258a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
258b0 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
258c0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
258d0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
258e0 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
258f0 72 6e 20 66 72 65 65 50 61 67 65 32 28 70 50 61  rn freePage2(pPa
25900 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
25910 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  pPage->pgno);.}.
25920 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
25930 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
25940 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
25950 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
25960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
25970 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
25980 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
25990 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
259a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
259b0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
259c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
259d0 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
259e0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
259f0 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50  vfl;.  u16 ovflP
25a00 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
25a10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25a20 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
25a30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
25a40 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
25a50 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
25a60 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
25a70 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
25a80 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
25a90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
25aa0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
25ab0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
25ac0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
25ad0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
25ae0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
25af0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
25b00 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
25b10 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
25b20 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
25b30 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
25b40 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
25b50 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
25b60 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
25b70 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
25b80 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
25b90 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
25ba0 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
25bb0 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
25bc0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
25bd0 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
25be0 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
25bf0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
25c00 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
25c10 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67   || ovflPgno>pag
25c20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
25c30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
25c40 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
25c50 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
25c60 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
25c70 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
25c80 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
25c90 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
25ca0 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
25cb0 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
25cc0 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
25cd0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
25ce0 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
25cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25d00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
25d10 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
25d20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
25d30 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
25d40 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
25d50 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
25d60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
25d70 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
25d80 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
25d90 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
25da0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
25db0 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
25dc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25dd0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
25de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25df0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
25e00 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
25e10 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
25e20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25e30 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
25e40 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
25e50 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
25e60 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
25e70 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
25e80 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
25e90 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
25ea0 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
25eb0 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
25ec0 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
25ed0 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
25ee0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
25ef0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
25f00 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
25f10 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
25f20 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
25f30 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
25f40 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
25f50 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
25f60 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
25f70 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
25f80 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
25f90 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
25fa0 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
25fb0 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
25fc0 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
25fd0 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
25fe0 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
25ff0 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
26000 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
26010 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
26020 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
26030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
26040 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
26050 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
26060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26070 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
26080 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
26090 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
260a0 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
260b0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
260c0 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
260d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
260e0 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
260f0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
26100 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
26110 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
26120 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
26130 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26150 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
26160 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
26170 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
26180 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261a0 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
261b0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
261c0 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
261d0 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
261e0 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
261f0 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
26200 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
26210 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
26220 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
26230 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
26240 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
26250 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
26260 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
26270 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
26280 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
26290 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
262a0 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
262b0 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
262c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
262d0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
262e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
262f0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
26300 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
26310 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
26320 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
26330 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
26340 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
26350 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
26360 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
26370 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
26380 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
26390 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
263a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
263b0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
263c0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
263d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
263e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
263f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
26400 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
26410 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
26420 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
26430 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
26440 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
26450 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
26460 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
26470 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
26480 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
26490 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d  Data+nZero);.  }
264a0 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
264b0 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  = nZero = 0;.  }
264c0 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
264d0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
264e0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
264f0 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  &nKey);.  sqlite
26500 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
26510 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
26520 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
26530 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
26540 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
26550 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
26560 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
26570 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28  t( info.nData==(
26580 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f  u32)(nData+nZero
26590 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ) );.  .  /* Fil
265a0 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
265b0 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
265c0 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
265d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
265e0 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
265f0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
26600 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
26610 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
26620 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79  e{ .    if( nKey
26630 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
26640 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
26650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26660 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RRUPT;.    }.   
26670 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e   nPayload += (in
26680 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  t)nKey;.    pSrc
26690 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
266a0 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  c = (int)nKey;. 
266b0 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69   }.  *pnSize = i
266c0 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61  nfo.nSize;.  spa
266d0 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c  ceLeft = info.nL
266e0 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64  ocal;.  pPayload
266f0 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
26700 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26  r];.  pPrior = &
26710 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
26720 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  flow];..  while(
26730 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
26740 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
26750 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
26760 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
26770 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
26780 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
26790 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
267a0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
267b0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
267c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
267d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
267e0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
267f0 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
26800 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
26810 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
26820 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
26830 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
26840 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
26850 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
26860 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
26870 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
26880 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
26890 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
268a0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
268b0 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
268c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
268d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
268e0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
268f0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
26900 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
26910 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
26920 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
26930 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
26940 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
26950 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
26960 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
26970 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
26980 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
26990 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
269a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
269b0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
269c0 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
269d0 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
269e0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
269f0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
26a00 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
26a10 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
26a20 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
26a30 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
26a40 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
26a50 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
26a60 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
26a70 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
26a80 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
26a90 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76   uninitialised v
26aa0 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
26ab0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
26ac0 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
26ad0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
26ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
26af0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26b00 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
26b10 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
26b20 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
26b30 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
26b40 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
26b50 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72  LOW1);.        r
26b60 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
26b70 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
26b80 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b  pe, pgnoPtrmap);
26b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
26ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
26bb0 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
26bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26bd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
26be0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26bf0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
26c00 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
26c10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26c20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
26c30 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
26c40 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
26c50 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
26c60 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
26c70 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
26c80 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
26c90 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
26ca0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
26cb0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
26cc0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
26cd0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
26ce0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
26cf0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
26d00 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
26d10 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
26d20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
26d30 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
26d40 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
26d50 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
26d60 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
26d70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
26d80 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
26d90 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
26da0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
26db0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
26dc0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
26dd0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
26de0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
26df0 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
26e00 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
26e10 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
26e20 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
26e30 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
26e40 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
26e50 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
26e60 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
26e70 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
26e80 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
26e90 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
26ea0 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
26eb0 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
26ec0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
26ed0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
26ee0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
26ef0 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
26f00 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
26f10 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
26f20 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
26f30 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
26f40 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
26f50 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
26f60 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
26f70 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
26f80 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
26f90 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
26fa0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
26fb0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
26fc0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
26fd0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
26fe0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
26ff0 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
27000 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
27010 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
27020 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
27030 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
27040 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
27050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27060 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
27070 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
27080 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
27090 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
270a0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
270b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
270c0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
270d0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
270e0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
270f0 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
27100 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
27110 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
27120 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
27130 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
27140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
27150 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
27160 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
27170 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
27180 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
27190 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
271a0 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
271b0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
271c0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
271d0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
271e0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
271f0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
27200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
27210 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
27220 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
27230 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27240 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
27250 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
27260 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
27270 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
27280 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
27290 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
272a0 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
272b0 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
272c0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
272d0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
272e0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
272f0 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
27300 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
27310 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
27320 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
27330 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
27340 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
27350 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
27360 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
27370 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
27380 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  int dropCell(Mem
27390 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
273a0 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
273b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
273c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
273d0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
273e0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
273f0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
27400 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
27410 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
27420 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
27430 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
27440 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
27450 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
27460 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
27470 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
27480 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
27490 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
274a0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
274b0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
274c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
274d0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
274e0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
274f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
27500 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
27510 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
27520 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
27530 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27540 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
27550 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
27560 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
27570 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
27580 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
27590 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
275a0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
275b0 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50  r);.  if( (pc<pP
275c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
275d0 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
275e0 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b  4)).     || (pc+
275f0 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  sz>pPage->pBt->u
27600 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20  sableSize) ){.  
27610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27620 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27630 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
27640 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
27650 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
27670 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66  turn rc;.  }.  f
27680 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
27690 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
276a0 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
276b0 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
276c0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
276d0 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
276e0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
276f0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
27700 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
27710 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
27720 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
27730 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   2;.  return SQL
27740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
27750 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
27760 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
27770 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
27780 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
27790 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
277a0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
277b0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
277c0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
277d0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
277e0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
277f0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
27800 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
27810 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
27820 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
27830 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
27840 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
27850 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
27860 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
27870 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
27880 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
27890 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
278a0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
278b0 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
278c0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
278d0 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
278e0 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
278f0 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
27900 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
27910 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
27920 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
27930 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
27940 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
27950 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
27960 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
27970 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
27980 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
27990 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
279a0 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
279b0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
279c0 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
279d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
279e0 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
279f0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
27a00 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
27a10 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
27a20 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
27a30 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
27a40 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
27a50 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
27a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
27a70 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
27a80 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
27a90 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
27aa0 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
27ab0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
27ac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
27ad0 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
27ae0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
27af0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
27b00 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
27b10 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
27b20 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
27b30 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
27b40 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
27b50 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
27b60 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
27b70 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
27b80 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
27b90 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
27ba0 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 20 20  .  Pgno iChild  
27bb0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
27bc0 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
27bd0 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
27be0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  this value */.){
27bf0 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
27c00 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
27c10 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
27c20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
27c30 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
27c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
27c50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
27c60 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
27c70 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
27c80 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
27c90 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20   cell in data[] 
27ca0 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
27cb0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
27cc0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
27cd0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
27ce0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
27cf0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
27d00 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
27d10 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
27d20 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
27d30 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
27d40 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
27d50 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74   Offset into dat
27d60 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20  a[] of the page 
27d70 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
27d80 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
27d90 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
27da0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
27db0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
27dc0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
27dd0 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
27de0 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
27df0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
27e00 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
27e10 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
27e20 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
27e30 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e   data[] */..  in
27e40 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c  t nSkip = (iChil
27e50 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61  d ? 4 : 0);..  a
27e60 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
27e70 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
27e80 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
27e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
27ea0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
27eb0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
27ec0 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
27ed0 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
27ee0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27ef0 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
27f00 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66  Size(pPage->aOvf
27f10 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
27f20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
27f30 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
27f40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
27f50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
27f60 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
27f70 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
27f80 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
27f90 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
27fa0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
27fb0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
27fc0 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
27fd0 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
27fe0 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
27ff0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
28000 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
28010 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
28020 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
28030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
28040 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
28050 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
28060 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
28070 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
28080 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
28090 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
280a0 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
280b0 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
280c0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
280d0 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  idx = (u16)i;.  
280e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
280f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28100 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
28110 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
28120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28130 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28140 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
28150 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
28160 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
28170 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
28180 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
28190 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d  aData;.    hdr =
281a0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
281b0 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  t;.    top = get
281c0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
281d0 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  5]);.    cellOff
281e0 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
281f0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
28200 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
28210 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b  2*pPage->nCell +
28220 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65   2;.    ins = ce
28230 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
28240 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f      if( end > to
28250 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20  p - sz ){.      
28260 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
28270 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
28280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
282a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
282b0 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65  }.      top = ge
282c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
282d0 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  +5]);.      asse
282e0 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20  rt( end + sz <= 
282f0 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  top );.    }.   
28300 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53   idx = allocateS
28310 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b  pace(pPage, sz);
28320 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
28330 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
28340 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74  ( end <= get2byt
28350 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
28360 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b 73  );.    if (idx+s
28370 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
28380 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20  usableSize) {.  
28390 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
283a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
283b0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
283c0 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
283d0 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b  age->nFree -= 2;
283e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
283f0 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43  a[idx+nSkip], pC
28400 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
28410 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43  kip);.    if( iC
28420 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
28430 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
28440 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
28450 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d  }.    for(j=end-
28460 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b  2, ptr=&data[j];
28470 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74   j>ins; j-=2, pt
28480 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72  r-=2){.      ptr
28490 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20  [0] = ptr[-2];. 
284a0 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74       ptr[1] = pt
284b0 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  r[-1];.    }.   
284c0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
284d0 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
284e0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
284f0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
28500 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
28510 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28520 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
28530 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
28540 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
28550 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
28560 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
28570 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
28580 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
28590 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
285a0 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
285b0 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
285c0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
285d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
285e0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
285f0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
28600 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  l);.    }.#endif
28610 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
28620 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28630 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
28640 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
28650 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
28660 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
28670 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
28680 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
28690 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
286a0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
286b0 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
286c0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
286d0 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
286e0 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
286f0 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
28700 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
28710 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
28720 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
28730 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
28740 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
28750 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
28760 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
28770 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
28780 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
28790 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
287a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
287b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
287c0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  */.  u8 *pCellpt
287d0 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  r;     /* Addres
287e0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
287f0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
28800 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
28810 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
28820 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
28830 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
28840 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
28850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28860 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
28870 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  or pPage */.  co
28880 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
28890 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
288a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
288b0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
288c0 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
288d0 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20  t int nUsable = 
288e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
288f0 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
28900 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a  e size of page *
28910 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
28920 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
28930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
28940 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28950 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
28960 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
28970 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65   nCell>=0 && nCe
28980 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
28990 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
289a0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
289b0 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
289c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
289d0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
289e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
289f0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
28a00 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
28a10 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
28a20 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
28a30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
28a40 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
28a50 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
28a60 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61  ta[hdr+5])==nUsa
28a70 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70  ble );..  pCellp
28a80 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
28a90 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e  ->cellOffset + n
28aa0 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
28ab0 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
28ac0 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
28ad0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
28ae0 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
28af0 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61     cellbody -= a
28b00 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Size[i];.    put
28b10 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
28b20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
28b30 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
28b40 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
28b50 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d  , aSize[i]);.  }
28b60 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
28b70 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
28b80 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
28b90 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62  ta[hdr+5], cellb
28ba0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
28bb0 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32  Free -= (nCell*2
28bc0 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c   + nUsable - cel
28bd0 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
28be0 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
28bf0 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
28c00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
28c10 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
28c20 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
28c30 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
28c40 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
28c50 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
28c60 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
28c70 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
28c80 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
28c90 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
28ca0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
28cb0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
28cc0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
28cd0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
28ce0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
28cf0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
28d00 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
28d10 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
28d20 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
28d30 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
28d40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
28d50 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
28d60 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
28d70 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
28d80 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
28d90 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
28da0 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
28db0 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
28dc0 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
28dd0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
28de0 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
28df0 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
28e00 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
28e10 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
28e20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
28e30 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
28e40 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
28e50 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
28e60 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
28e70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28e80 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
28e90 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
28ea0 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
28eb0 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
28ec0 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
28ed0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
28ee0 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66  balance */...#if
28ef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28f00 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
28f10 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
28f20 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
28f30 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
28f40 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
28f50 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
28f60 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
28f70 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
28f80 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
28f90 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
28fa0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
28fb0 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
28fc0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
28fd0 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
28fe0 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
28ff0 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
29000 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
29010 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
29020 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
29030 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
29040 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
29050 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
29060 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
29070 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
29080 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
29090 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
290a0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
290b0 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
290c0 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
290d0 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
290e0 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
290f0 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
29100 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
29110 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
29120 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
29130 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
29140 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
29150 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
29160 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
29170 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
29180 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
29190 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
291a0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
291b0 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
291c0 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
291d0 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
291e0 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
291f0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29200 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
29210 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70  e..**.** The pSp
29220 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73  ace buffer is us
29230 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65  ed to store a te
29240 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20  mporary copy of 
29250 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63  the divider.** c
29260 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
29270 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70   inserted into p
29280 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63  Parent. Such a c
29290 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
292a0 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65  a 4.** byte page
292b0 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64   number followed
292c0 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c   by a variable l
292d0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49  ength integer. I
292e0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
292f0 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74  , at most 13 byt
29300 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53  es. Hence the pS
29310 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74  pace buffer must
29320 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20   be at.** least 
29330 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
29340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29350 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
29360 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
29370 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
29380 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42  u8 *pSpace){.  B
29390 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70  tShared *const p
293a0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
293b0 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61      /* B-Tree Da
293c0 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50  tabase */.  MemP
293d0 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  age *pNew;      
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293f0 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
29400 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ted page */.  in
29410 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29430 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
29440 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
29450 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
29460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29470 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e  age number of pN
29480 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ew */..  assert(
29490 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
294a0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
294b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
294c0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
294d0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
294e0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
294f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29500 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
29510 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ;..  if( pPage->
29520 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72  nCell<=0 ) retur
29530 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29540 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _BKPT;..  /* All
29550 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
29560 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c  . This page will
29570 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68   become the righ
29580 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20  t-sibling of .  
29590 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74  ** pPage. Make t
295a0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
295b0 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74  ritable, so that
295c0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
295d0 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62   cell.  ** may b
295e0 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62  e inserted. If b
295f0 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74  oth these operat
29600 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
29610 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20  ful, proceed..  
29620 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
29630 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
29640 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
29650 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20  , 0, 0);..  if( 
29660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29670 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
29680 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
29690 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
296a0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
296b0 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  ll;.    u16 szCe
296c0 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
296d0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
296e0 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
296f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
29700 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
29710 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
29720 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
29730 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
29740 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
29750 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
29760 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
29770 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
29780 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
29790 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
297a0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
297b0 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
297c0 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20   &szCell);..    
297d0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
297e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
297f0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
29800 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
29810 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
29820 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
29830 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
29840 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
29850 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
29860 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
29870 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
29880 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
29890 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
298a0 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
298b0 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
298c0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
298d0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
298e0 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
298f0 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
29900 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
29910 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
29920 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
29930 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
29940 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
29950 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
29960 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
29970 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
29980 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
29990 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
299a0 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
299b0 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
299c0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
299d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
299e0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
299f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
29a00 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
29a10 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
29a20 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
29a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
29a40 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
29a50 61 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  al && rc==SQLITE
29a60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29a70 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29a80 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
29a90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29aa0 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
29ab0 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
29ac0 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
29ad0 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
29ae0 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
29af0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
29b00 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
29b10 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
29b20 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
29b30 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
29b40 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
29b50 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
29b60 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
29b70 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
29b80 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
29b90 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
29ba0 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
29bb0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
29bc0 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
29bd0 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
29be0 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
29bf0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
29c00 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
29c10 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
29c20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
29c30 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
29c40 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
29c50 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
29c60 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
29c70 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
29c80 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
29c90 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
29ca0 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
29cb0 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
29cc0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
29cd0 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
29ce0 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
29cf0 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
29d00 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
29d10 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
29d20 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
29d30 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
29d40 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
29d50 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
29d60 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
29d70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
29d80 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
29d90 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
29da0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
29db0 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
29dc0 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
29dd0 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
29de0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
29df0 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
29e00 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
29e10 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
29e20 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
29e30 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
29e40 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
29e50 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
29e60 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
29e70 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
29e80 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
29e90 61 72 65 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e  arent,pParent->n
29ea0 43 65 6c 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74  Cell,pSpace,(int
29eb0 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 30  )(pOut-pSpace),0
29ec0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a  ,pPage->pgno);..
29ed0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72      /* Set the r
29ee0 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
29ef0 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f  er of pParent to
29f00 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
29f10 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  w page. */.    p
29f20 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
29f30 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
29f40 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
29f50 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
29f60 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
29f70 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
29f80 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
29f90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
29fa0 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  w);.  }..  retur
29fb0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
29fc0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
29fd0 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23  ICKBALANCE */..#
29fe0 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
29ff0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2a000 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79  t contribute any
2a010 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65  thing to the ope
2a020 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  ration of SQLite
2a030 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  ..** it is somet
2a040 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74  imes activated t
2a050 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65  emporarily while
2a060 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20   debugging code 
2a070 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20  responsible .** 
2a080 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e  for setting poin
2a090 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e  ter-map entries.
2a0a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2a0b0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
2a0c0 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65  MemPage **apPage
2a0d0 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
2a0e0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
2a0f0 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b  i=0; i<nPage; i+
2a100 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a  +){.    Pgno n;.
2a110 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65      u8 e;.    Me
2a120 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61  mPage *pPage = a
2a130 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74  pPage[i];.    Bt
2a140 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2a150 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  age->pBt;.    as
2a160 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2a170 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nit );..    for(
2a180 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43  j=0; j<pPage->nC
2a190 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ell; j++){.     
2a1a0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2a1b0 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20        u8 *z;.   
2a1c0 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e    .      z = fin
2a1d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b  dCell(pPage, j);
2a1e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
2a1f0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2a200 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29  pPage, z, &info)
2a210 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
2a220 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
2a230 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
2a240 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e  = get4byte(&z[in
2a250 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2a260 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
2a270 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c  t(pBt, ovfl, &e,
2a280 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2a290 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2a2a0 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2a2b0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20  P_OVERFLOW1 );. 
2a2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a2d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2a2e0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68  .        Pgno ch
2a2f0 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a  ild = get4byte(z
2a300 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2a310 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2a320 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2a330 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2a340 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2a350 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
2a360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2a370 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2a380 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
2a390 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2a3a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2a3b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2a3c0 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  8]);.      ptrma
2a3d0 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2a3e0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2a3f0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2a400 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2a410 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
2a420 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a430 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  1;.}.#endif.../*
2a440 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a450 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63   redistributes c
2a460 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72  ells on the iPar
2a470 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20  entIdx'th child 
2a480 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68  of pParent.** (h
2a490 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61  ereafter "the pa
2a4a0 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32  ge") and up to 2
2a4b0 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61   siblings so tha
2a4c0 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  t all pages have
2a4d0 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61   about the.** sa
2a4e0 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65  me amount of fre
2a4f0 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79  e space. Usually
2a500 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e   a single siblin
2a510 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  g on either side
2a520 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
2a530 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20  are used in the 
2a540 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67  balancing, thoug
2a550 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20  h both siblings 
2a560 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
2a570 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74  one.** side if t
2a580 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66  he page is the f
2a590 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69  irst or last chi
2a5a0 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74  ld of its parent
2a5b0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a  . If the page .*
2a5c0 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  * has fewer than
2a5d0 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d   2 siblings (som
2a5e0 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e  ething which can
2a5f0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2a600 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  the page.** is a
2a610 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20   root page or a 
2a620 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20  child of a root 
2a630 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61  page) then all a
2a640 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67  vailable sibling
2a650 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65  s.** participate
2a660 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
2a670 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  g..**.** The num
2a680 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ber of siblings 
2a690 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68  of the page migh
2a6a0 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
2a6b0 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a  r decreased by .
2a6c0 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e  ** one or two in
2a6d0 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65   an effort to ke
2a6e0 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20  ep pages nearly 
2a6f0 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65  full but not ove
2a700 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e  r full. .**.** N
2a710 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
2a720 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a730 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68  lled, some of th
2a740 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  e cells on the p
2a750 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  age.** might not
2a760 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f   actually be sto
2a770 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61  red in MemPage.a
2a780 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e  Data[]. This can
2a790 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68   happen.** if th
2a7a0 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  e page is overfu
2a7b0 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ll. This routine
2a7c0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c   ensures that al
2a7d0 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65  l cells allocate
2a7e0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  d.** to the page
2a7f0 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
2a800 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61  s fit into MemPa
2a810 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72  ge.aData[] befor
2a820 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2a830 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
2a840 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
2a850 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
2a860 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d  iblings, cells m
2a870 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65  ay be.** inserte
2a880 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65  d into or remove
2a890 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  d from the paren
2a8a0 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  t page (pParent)
2a8b0 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61  . Doing so.** ma
2a8c0 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65  y cause the pare
2a8d0 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d  nt page to becom
2a8e0 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
2a8f0 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73  derfull. If this
2a900 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20  .** happens, it 
2a910 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
2a920 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
2a930 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ler to invoke th
2a940 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c  e correct.** bal
2a950 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74  ancing routine t
2a960 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c  o fix this probl
2a970 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61  em (see the bala
2a980 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20  nce() routine). 
2a990 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  .**.** If this r
2a9a0 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72  outine fails for
2a9b0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20   any reason, it 
2a9c0 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20  might leave the 
2a9d0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61  database.** in a
2a9e0 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65   corrupted state
2a9f0 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  . So if this rou
2aa00 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
2aa10 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
2aa20 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
2aa30 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69  k..**.** The thi
2aa40 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
2aa50 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f  his function, aO
2aa60 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70  vflSpace, is a p
2aa70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62  ointer to a.** b
2aa80 75 66 66 65 72 20 70 61 67 65 2d 73 69 7a 65 20  uffer page-size 
2aa90 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49  bytes in size. I
2aaa0 66 2c 20 69 6e 20 69 6e 73 65 72 74 69 6e 67 20  f, in inserting 
2aab0 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70  cells into the p
2aac0 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70  arent.** page (p
2aad0 50 61 72 65 6e 74 29 2c 20 74 68 65 20 70 61 72  Parent), the par
2aae0 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
2aaf0 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20   overfull, this 
2ab00 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65  buffer is.** use
2ab10 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70  d to store the p
2ab20 61 72 65 6e 74 73 20 6f 76 65 72 66 6c 6f 77 20  arents overflow 
2ab30 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74  cells. Because t
2ab40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73  his function ins
2ab50 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75  erts.** a maximu
2ab60 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65  m of four divide
2ab70 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  r cells into the
2ab80 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e   parent page, an
2ab90 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  d the maximum.**
2aba0 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   size of a cell 
2abb0 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e  stored within an
2abc0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69   internal node i
2abd0 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68  s always less th
2abe0 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65  an 1/4.** of the
2abf0 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
2ac00 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66  aOvflSpace[] buf
2ac10 66 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  fer is guarantee
2ac20 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a  d to be large.**
2ac30 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20   enough for all 
2ac40 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
2ac50 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70  **.** If aOvflSp
2ac60 61 63 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ace is set to a 
2ac70 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68  null pointer, th
2ac80 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2ac90 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  rns .** SQLITE_N
2aca0 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  OMEM..*/.static 
2acb0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
2acc0 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oot(.  MemPage *
2acd0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  pParent,        
2ace0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
2acf0 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67   page of sibling
2ad00 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
2ad10 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
2ad20 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  tIdx,           
2ad30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2ad40 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20  f "the page" in 
2ad50 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20  pParent */.  u8 
2ad60 2a 61 4f 76 66 6c 53 70 61 63 65 20 20 20 20 20  *aOvflSpace     
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad80 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
2ad90 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72  of space for par
2ada0 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 29 7b 0a 20  ent ovfl */.){. 
2adb0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2add0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
2ade0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
2adf0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2ae00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ae10 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
2ae20 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
2ae30 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
2ae40 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
2ae50 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
2ae60 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
2ae70 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
2ae80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ae90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2aea0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
2aeb0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
2aec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aed0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2aee0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
2aef0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
2af00 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
2af10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2af20 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
2af30 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
2af40 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
2af50 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
2af60 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
2af70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2af80 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2af90 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
2afa0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   code */.  int l
2afb0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
2afc0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
2afd0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2afe0 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
2aff0 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b010 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
2b020 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
2b030 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
2b040 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b060 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
2b070 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
2b080 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
2b090 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2b0a0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
2b0b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
2b0c0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
2b0d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b0e0 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
2b0f0 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
2b100 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
2b110 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b130 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2b140 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
2b150 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
2b160 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
2b170 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2b180 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
2b190 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
2b1a0 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
2b1b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2b1c0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
2b1d0 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
2b1e0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
2b1f0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
2b200 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2b210 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
2b220 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
2b230 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
2b240 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
2b250 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
2b260 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
2b270 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
2b280 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
2b290 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
2b2a0 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
2b2b0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
2b2c0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
2b2d0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
2b2e0 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
2b2f0 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
2b300 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
2b310 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
2b320 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
2b330 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
2b340 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
2b350 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2b360 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2b370 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
2b380 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
2b390 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
2b3a0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2b3b0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
2b3c0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
2b3d0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
2b3e0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2b3f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b400 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
2b410 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
2b420 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b440 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2b450 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2b460 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
2b470 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
2b480 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
2b490 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
2b4a0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
2b4b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
2b4e0 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
2b4f0 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
2b500 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
2b510 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b520 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2b530 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2b540 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2b550 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2b560 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2b570 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
2b580 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
2b590 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
2b5a0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
2b5b0 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
2b5c0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
2b5d0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
2b5e0 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
2b5f0 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
2b600 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
2b610 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
2b620 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
2b630 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
2b640 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
2b650 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
2b660 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
2b670 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
2b680 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
2b690 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
2b6a0 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
2b6b0 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
2b6c0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
2b6d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2b6e0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2b6f0 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2b700 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2b710 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2b720 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2b730 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  || pParent->aOvf
2b740 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e  l[0].idx==iParen
2b750 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
2b760 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
2b770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b780 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2b790 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
2b7a0 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
2b7b0 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
2b7c0 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
2b7d0 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
2b7e0 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
2b7f0 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
2b800 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
2b810 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
2b820 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
2b830 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
2b840 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
2b850 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
2b860 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
2b870 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
2b880 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
2b890 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
2b8a0 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
2b8b0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2b8c0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2b8d0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2b8e0 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2b8f0 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
2b900 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
2b910 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
2b920 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
2b930 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2b940 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
2b950 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
2b960 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
2b970 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
2b980 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
2b990 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
2b9a0 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
2b9b0 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e 65 20  page, as if one 
2b9c0 65 78 69 73 74 65 64 20 69 74 20 68 61 73 20 61  existed it has a
2b9d0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
2b9e0 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20 20   removed.  */.  
2b9f0 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
2ba00 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
2ba10 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
2ba20 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
2ba30 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  = 0;.    nOld = 
2ba40 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i+1;.  }else{.  
2ba50 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20    nOld = 3;.    
2ba60 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
2ba70 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
2ba80 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
2ba90 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
2baa0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2bab0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
2bac0 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c  v = i-2;.    }el
2bad0 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20  se{.      nxDiv 
2bae0 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
2baf0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b      }.    i = 2;
2bb00 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78  .  }.  if( (i+nx
2bb10 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2bb20 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
2bb30 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2bb40 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
2bb50 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2bb60 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
2bb70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
2bb80 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
2bb90 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2bba0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2bbb0 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
2bbc0 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
2bbd0 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
2bbe0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
2bbf0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
2bc00 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
2bc10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2bc20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
2bc30 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d 65  , 0, i*sizeof(Me
2bc40 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
2bc50 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2bc60 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
2bc70 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
2bc80 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
2bc90 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
2bca0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
2bcb0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
2bcc0 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e     if( pParent->
2bcd0 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69 2b 6e  nOverflow && i+n
2bce0 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
2bcf0 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a 20  Ovfl[0].idx ){. 
2bd00 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2bd10 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2bd20 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70  ].pCell;.      p
2bd30 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2bd40 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2bd50 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2bd60 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2bd70 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2bd80 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2bd90 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  low = 0;.    }el
2bda0 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  se{.      apDiv[
2bdb0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
2bdc0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2bdd0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2bde0 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  w);.      pgno =
2bdf0 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2be00 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
2be10 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2be20 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
2be30 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [i]);..      /* 
2be40 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72  Drop the cell fr
2be50 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2be60 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69  ge. apDiv[i] sti
2be70 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20  ll points to.   
2be80 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77     ** the cell w
2be90 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ithin the parent
2bea0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
2beb0 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65   has been droppe
2bec0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  d..      ** This
2bed0 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
2bee0 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c   dropping a cell
2bef0 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
2bf00 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
2bf10 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
2bf20 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66  f it, and this f
2bf30 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2bf40 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a   need the first.
2bf50 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2bf60 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  tes of the divid
2bf70 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20  er cell. So the 
2bf80 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20  pointer is safe 
2bf90 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
2bfa0 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20  later on.  .    
2bfb0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
2bfc0 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63  less SQLite is c
2bfd0 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72  ompiled in secur
2bfe0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
2bff0 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20  n this case,.   
2c000 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
2c010 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
2c020 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
2c030 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
2c040 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
2c050 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
2c060 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
2c070 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
2c080 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
2c090 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
2c0a0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
2c0b0 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
2c0c0 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
2c0d0 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
2c0e0 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
2c0f0 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  d.  */.#ifdef SQ
2c100 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
2c110 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  TE.      memcpy(
2c120 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2c130 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2c140 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  ata], apDiv[i], 
2c150 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
2c160 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
2c170 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
2c180 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
2c190 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  ;.#endif.      d
2c1a0 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
2c1b0 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2c1c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e  ->nOverflow, szN
2c1d0 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
2c1e0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
2c1f0 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
2c200 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
2c210 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
2c220 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
2c230 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
2c240 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
2c250 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
2c260 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
2c270 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
2c280 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
2c290 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
2c2a0 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
2c2b0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
2c2c0 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
2c2d0 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2c2e0 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
2c2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2c300 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
2c310 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2c320 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
2c330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2c340 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
2c350 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2c380 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
2c390 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c3c0 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
2c3d0 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
2c3e0 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
2c3f0 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
2c400 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
2c410 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
2c420 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2c430 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2c440 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2c450 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2c460 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
2c470 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
2c480 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
2c490 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
2c4a0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2c4b0 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
2c4c0 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
2c4d0 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
2c4e0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
2c4f0 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
2c500 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2c510 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
2c520 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
2c530 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
2c540 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2c550 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
2c560 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
2c570 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
2c580 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
2c590 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
2c5a0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
2c5b0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
2c5c0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
2c5d0 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
2c5e0 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
2c5f0 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
2c600 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
2c610 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
2c620 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
2c630 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
2c640 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
2c650 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
2c660 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
2c670 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
2c680 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
2c690 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2c6a0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
2c6b0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
2c6c0 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
2c6d0 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
2c6e0 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
2c6f0 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
2c700 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2c710 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
2c720 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
2c730 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
2c740 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
2c750 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
2c760 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
2c770 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
2c780 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
2c790 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
2c7a0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
2c7b0 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
2c7c0 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   */.  leafCorrec
2c7d0 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  tion = apOld[0]-
2c7e0 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
2c7f0 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ata = apOld[0]->
2c800 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
2c810 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2c820 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b  {.    int limit;
2c830 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66  .    .    /* Bef
2c840 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
2c850 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20  ng else, take a 
2c860 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68  copy of the i'th
2c870 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e   original siblin
2c880 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  g.    ** The res
2c890 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
2c8a0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
2c8b0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
2c8c0 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74   rather.    ** t
2c8d0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
2c8e0 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
2c8f0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2c900 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
2c910 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66     ** process of
2c920 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
2c930 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  en.  */.    MemP
2c940 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
2c950 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
2c960 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  *)&aSpace1[pBt->
2c970 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b  pageSize + k*i];
2c980 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2c990 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
2c9a0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2c9b0 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20    pOld->aData = 
2c9c0 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b  (void*)&pOld[1];
2c9d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2c9e0 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
2c9f0 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
2ca00 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c  ageSize);..    l
2ca10 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
2ca20 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
2ca30 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
2ca40 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
2ca50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2ca60 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2ca70 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2ca80 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
2ca90 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
2caa0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2cab0 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
2cac0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
2cad0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
2cae0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
2caf0 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
2cb00 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
2cb10 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 73 7a       u16 sz = sz
2cb20 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38  New[i];.      u8
2cb30 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61   *pTemp;.      a
2cb40 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
2cb50 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2cb60 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2cb70 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  sz;.      pTemp 
2cb80 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
2cb90 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63  e1];.      iSpac
2cba0 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
2cbb0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
2cbc0 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
2cbd0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
2cbe0 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ace1<=pBt->pageS
2cbf0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ize );.      mem
2cc00 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
2cc10 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
2cc20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
2cc30 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
2cc40 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  tion;.      asse
2cc50 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2cc60 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72  on==0 || leafCor
2cc70 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
2cc80 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2cc90 5d 20 2d 3d 20 28 75 31 36 29 6c 65 61 66 43 6f  ] -= (u16)leafCo
2cca0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2ccb0 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
2ccc0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2ccd0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2cce0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2ccf0 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64  assert( pOld->hd
2cd00 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  rOffset==0 );.  
2cd10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
2cd20 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
2cd30 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
2cd40 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
2cd50 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ft.        ** po
2cd60 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
2cd70 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
2cd80 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
2cd90 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
2cda0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
2cdb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cdc0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2cdd0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
2cde0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
2cdf0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
2ce00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
2ce10 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
2ce20 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
2ce30 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
2ce40 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2ce50 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
2ce60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ce70 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2ce80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
2ce90 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
2cea0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2ceb0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
2cec0 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
2ced0 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
2cee0 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
2cef0 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
2cf00 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
2cf10 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
2cf20 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
2cf30 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
2cf40 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
2cf50 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
2cf60 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
2cf70 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
2cf80 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
2cf90 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
2cfa0 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
2cfb0 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
2cfc0 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
2cfd0 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
2cfe0 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
2cff0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
2d000 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
2d010 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
2d020 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
2d030 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
2d040 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
2d050 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
2d060 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
2d070 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
2d080 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
2d090 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
2d0a0 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
2d0b0 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
2d0c0 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
2d0d0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2d0e0 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
2d0f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2d100 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
2d110 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
2d120 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
2d130 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
2d140 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
2d150 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
2d160 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
2d170 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
2d180 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
2d190 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
2d1a0 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
2d1b0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
2d1c0 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
2d1d0 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
2d1e0 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
2d1f0 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
2d200 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
2d210 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
2d220 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
2d230 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
2d240 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
2d250 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
2d260 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b     if( k>NB+1 ){
2d270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d280 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e  RUPT; goto balan
2d290 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20  ce_cleanup; }.  
2d2a0 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
2d2b0 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
2d2c0 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
2d2d0 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
2d2e0 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
2d2f0 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
2d300 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
2d310 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
2d320 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
2d330 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
2d340 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
2d350 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
2d360 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
2d370 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
2d380 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
2d390 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
2d3a0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
2d3b0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
2d3c0 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
2d3d0 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
2d3e0 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
2d3f0 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
2d400 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
2d410 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2d420 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
2d430 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
2d440 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
2d450 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
2d460 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
2d470 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
2d480 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
2d490 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
2d4a0 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
2d4b0 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
2d4c0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
2d4d0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
2d4e0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
2d4f0 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
2d500 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
2d510 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
2d520 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
2d530 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
2d540 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
2d550 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
2d560 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
2d570 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
2d580 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
2d590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d5a0 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
2d5b0 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
2d5c0 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
2d5d0 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
2d5e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2d5f0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
2d600 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
2d610 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
2d620 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
2d630 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
2d640 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
2d650 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
2d660 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2d670 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
2d680 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
2d690 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
2d6a0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
2d6b0 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
2d6c0 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
2d6d0 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
2d6e0 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
2d6f0 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
2d700 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
2d710 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
2d720 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
2d730 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
2d740 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
2d750 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
2d760 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
2d770 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
2d780 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
2d790 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
2d7a0 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
2d7b0 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
2d7c0 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
2d7d0 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
2d7e0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
2d7f0 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
2d800 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
2d810 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
2d820 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
2d830 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
2d840 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
2d850 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
2d860 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
2d870 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
2d880 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
2d890 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
2d8a0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2d8b0 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
2d8c0 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b  d  ",.    apOld[
2d8d0 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e  0]->pgno, .    n
2d8e0 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31  Old>=2 ? apOld[1
2d8f0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20  ]->pgno : 0,.   
2d900 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64   nOld>=3 ? apOld
2d910 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20  [2]->pgno : 0.  
2d920 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ));..  /*.  ** A
2d930 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
2d940 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
2d950 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
2d960 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ible..  */.  if(
2d970 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c   apOld[0]->pgno<
2d980 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =1 ){.    rc = S
2d990 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2d9a0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2d9b0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
2d9c0 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
2d9d0 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
2d9e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2d9f0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
2da00 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
2da10 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
2da20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
2da30 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
2da40 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
2da50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2da60 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2da70 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
2da80 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
2da90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2daa0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2dab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dac0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
2dad0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2dae0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2daf0 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
2db00 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
2db10 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2db20 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2db30 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
2db40 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
2db50 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
2db60 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
2db70 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
2db80 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
2db90 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
2dba0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2dbb0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2dbc0 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d  apPut(pBt, pNew-
2dbd0 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2dbe0 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2dbf0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
2dc00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2dc10 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2dc20 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2dc30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dc40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2dc50 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
2dc60 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
2dc70 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
2dc80 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
2dc90 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
2dca0 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2dcb0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2dcc0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2dcd0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2dce0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2dcf0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
2dd00 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2dd10 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
2dd20 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
2dd30 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
2dd40 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
2dd50 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
2dd60 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
2dd70 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
2dd80 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
2dd90 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
2dda0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
2ddb0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
2ddc0 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
2ddd0 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
2dde0 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
2ddf0 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
2de00 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
2de10 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
2de20 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
2de30 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
2de40 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
2de50 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
2de60 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
2de70 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
2de80 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
2de90 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
2dea0 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
2deb0 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
2dec0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
2ded0 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
2dee0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
2def0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
2df00 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
2df10 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
2df20 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
2df30 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
2df40 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
2df50 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
2df60 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
2df70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
2df80 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
2df90 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
2dfa0 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
2dfb0 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
2dfc0 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
2dfd0 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
2dfe0 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
2dff0 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
2e000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2e010 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
2e020 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
2e030 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
2e040 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d     t = apNew[i]-
2e050 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20  >pgno;.      pT 
2e060 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
2e070 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
2e080 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
2e090 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
2e0a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
2e0b0 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
2e0c0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
2e0d0 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
2e0e0 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
2e0f0 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
2e100 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
2e110 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
2e120 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
2e130 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
2e140 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
2e150 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
2e160 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
2e170 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
2e180 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
2e190 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
2e1a0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
2e1b0 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
2e1c0 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
2e1d0 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
2e1e0 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
2e1f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2e200 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2e210 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2e220 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
2e230 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
2e240 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
2e250 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
2e260 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
2e270 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
2e280 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
2e290 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
2e2a0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
2e2b0 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
2e2c0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
2e2d0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
2e2e0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
2e2f0 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
2e300 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
2e310 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
2e320 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
2e330 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
2e340 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
2e350 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
2e360 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
2e370 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2e380 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
2e390 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
2e3a0 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
2e3b0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2e3c0 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
2e3d0 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
2e3e0 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
2e3f0 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
2e400 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
2e410 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
2e420 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
2e430 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
2e440 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
2e450 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2e460 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
2e470 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
2e480 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
2e490 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
2e4a0 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65  */.    if( i<nNe
2e4b0 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29  w-1 && j<nCell )
2e4c0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
2e4d0 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
2e4e0 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
2e4f0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
2e500 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
2e510 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
2e520 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
2e530 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
2e540 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2e550 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
2e560 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53  OvflSpace[iOvflS
2e570 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28  pace];.      if(
2e580 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a   !pNew->leaf ){.
2e590 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2e5a0 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pNew->aData[8], 
2e5b0 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20  pCell, 4);.     
2e5c0 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
2e5d0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
2e5e0 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
2e5f0 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
2e600 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
2e610 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
2e620 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2e630 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
2e640 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
2e650 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
2e660 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
2e670 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
2e680 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
2e690 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
2e6a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
2e6b0 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
2e6c0 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
2e6d0 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
2e6e0 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
2e6f0 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
2e700 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
2e710 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71   j--;.        sq
2e720 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
2e730 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
2e740 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
2e750 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2e760 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
2e770 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
2e780 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
2e790 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
2e7a0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
2e7b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e7c0 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
2e7d0 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
2e7e0 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
2e7f0 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
2e800 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
2e810 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
2e820 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
2e830 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
2e840 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
2e850 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
2e860 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
2e870 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
2e880 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
2e890 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
2e8a0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c       ** (see sql
2e8b0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
2e8c0 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
2e8d0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
2e8e0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
2e8f0 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
2e900 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
2e910 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
2e920 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
2e930 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
2e940 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
2e950 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
2e960 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e970 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2e980 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
2e990 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
2e9a0 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
2e9b0 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
2e9c0 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
2e9d0 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
2e9e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
2e9f0 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
2ea00 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
2ea10 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
2ea20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
2ea30 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
2ea40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2ea50 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
2ea60 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2ea70 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
2ea80 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
2ea90 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
2eaa0 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
2eab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2eac0 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
2ead0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
2eae0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
2eaf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
2eb00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2eb10 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d  iOvflSpace<=pBt-
2eb20 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
2eb30 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
2eb40 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
2eb50 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
2eb60 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  emp, pNew->pgno)
2eb70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2eb80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2eb90 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2eba0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ebb0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ebc0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2ebd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2ebe0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
2ebf0 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
2ec00 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
2ec10 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2ec20 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
2ec30 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
2ec40 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
2ec50 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
2ec60 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c  ){.    u8 *zChil
2ec70 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  d = &apCopy[nOld
2ec80 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20  -1]->aData[8];. 
2ec90 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
2eca0 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
2ecb0 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a  8], zChild, 4);.
2ecc0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
2ecd0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2ece0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
2ecf0 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
2ed00 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
2ed10 2e 20 0a 20 20 2a 2a 20 54 68 65 72 65 20 61 72  . .  ** There ar
2ed20 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  e several differ
2ed30 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69  ent types of poi
2ed40 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2ed50 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20   that need to.  
2ed60 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
2ed70 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
2ed80 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
2ed90 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
2eda0 72 65 61 64 79 2c 20 62 75 74 0a 20 20 2a 2a 20  ready, but.  ** 
2edb0 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54  many have not. T
2edc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
2edd0 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 2a 2a 0a  a summary:.  **.
2ede0 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e    **   1) The en
2edf0 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
2ee00 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e   with new siblin
2ee10 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  g pages that wer
2ee20 65 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20  e not.  **      
2ee30 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68  siblings when th
2ee40 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
2ee50 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61  called. These ha
2ee60 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
2ee70 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57       been set. W
2ee80 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
2ee90 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20  worry about old 
2eea0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
2eeb0 72 65 0a 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  re.  **      mov
2eec0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
2eed0 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
2eee0 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
2eef0 6b 65 6e 20 63 61 72 65 0a 20 20 2a 2a 20 20 20  ken care.  **   
2ef00 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 2a     of those..  *
2ef10 2a 0a 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20  *.  **   2) The 
2ef20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2ef30 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
2ef40 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76  ith the first ov
2ef50 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 20 20 20 20  erflow.  **     
2ef60 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
2ef70 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
2ef80 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
2ef90 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
2efa0 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c   **      have al
2efb0 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  so already been 
2efc0 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79  taken care of by
2efd0 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
2efe0 29 20 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ) code..  **.  *
2eff0 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73 69  *   3) If the si
2f000 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
2f010 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
2f020 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
2f030 20 6f 66 0a 20 20 2a 2a 20 20 20 20 20 20 63 65   of.  **      ce
2f040 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
2f050 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
2f060 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
2f070 70 64 61 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  pdated..  **.  *
2f080 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
2f090 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
2f0a0 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
2f0b0 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
2f0c0 61 6e 79 0a 20 20 2a 2a 20 20 20 20 20 20 6f 76  any.  **      ov
2f0d0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65  erflow pages use
2f0e0 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73  d by these cells
2f0f0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
2f100 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 20 20 20  updated.  **    
2f110 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
2f120 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
2f130 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
2f140 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2f150 73 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  s)..  **.  **   
2f160 35 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  5) If the siblin
2f170 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
2f180 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
2f190 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
2f1a0 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 66  *      entries f
2f1b0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  or the right-chi
2f1c0 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63 68  ld pages of each
2f1d0 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65   sibling may nee
2f1e0 64 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62  d.  **      to b
2f1f0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2a 0a  e updated..  **.
2f200 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
2f210 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
2f220 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
2f230 20 63 6f 64 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   code. The follo
2f240 77 69 6e 67 0a 20 20 2a 2a 20 62 6c 6f 63 6b 20  wing.  ** block 
2f250 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73  deals with cases
2f260 20 33 20 61 6e 64 20 34 2e 20 53 69 6e 63 65 20   3 and 4. Since 
2f270 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
2f280 72 20 6d 61 70 20 65 6e 74 72 79 0a 20 20 2a 2a  r map entry.  **
2f290 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79   is a relatively
2f2a0 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
2f2b0 74 69 6f 6e 2c 20 74 68 69 73 20 63 6f 64 65 20  tion, this code 
2f2c0 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65  only sets pointe
2f2d0 72 0a 20 20 2a 2a 20 6d 61 70 20 65 6e 74 72 69  r.  ** map entri
2f2e0 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
2f2f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
2f300 68 61 74 20 68 61 76 65 20 61 63 74 75 61 6c 6c  hat have actuall
2f310 79 20 6d 6f 76 65 64 0a 20 20 2a 2a 20 62 65 74  y moved.  ** bet
2f320 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a  ween pages.  */.
2f330 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2f340 55 4d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  UM ){.    MemPag
2f350 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
2f360 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
2f370 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
2f380 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
2f390 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
2f3a0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
2f3b0 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
2f3c0 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
2f3d0 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
2f3e0 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
2f3f0 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ow ? pOld->aOvfl
2f400 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20  [0].idx : -1);. 
2f410 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20     j = 0;       
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f430 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2f440 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70   'old' sibling p
2f450 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30  age */.    k = 0
2f460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f480 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73   Current 'new' s
2f490 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
2f4a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2f4b0 65 6c 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ell && rc==SQLIT
2f4c0 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
2f4d0 20 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20    int isDivider 
2f4e0 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 0;.      while
2f4f0 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b  ( i==iNextOld ){
2f500 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
2f510 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
2f520 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
2f530 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
2f540 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20  ll on old.      
2f550 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
2f560 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e j. If the sibl
2f570 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
2f580 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
2f590 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
2f5a0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
2f5b0 6c 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65  l i was a divide
2f5c0 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  r cell. */.     
2f5d0 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79     pOld = apCopy
2f5e0 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++j];.        i
2f5f0 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c  NextOld = i + !l
2f600 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
2f610 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f  nCell + pOld->nO
2f620 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
2f630 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72   if( pOld->nOver
2f640 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
2f650 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f    nOverflow = pO
2f660 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
2f670 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
2f680 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ow = i + !leafDa
2f690 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ta + pOld->aOvfl
2f6a0 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20  [0].idx;.       
2f6b0 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76   }.        isDiv
2f6c0 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61  ider = !leafData
2f6d0 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;  .      }..   
2f6e0 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
2f6f0 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c  low>0 || iOverfl
2f700 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73  ow<i );.      as
2f710 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32  sert(nOverflow<2
2f720 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b   || pOld->aOvfl[
2f730 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f  0].idx==pOld->aO
2f740 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20  vfl[1].idx-1);. 
2f750 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
2f760 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d  rflow<3 || pOld-
2f770 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70  >aOvfl[1].idx==p
2f780 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64  Old->aOvfl[2].id
2f790 78 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x-1);.      if( 
2f7a0 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  i==iOverflow ){.
2f7b0 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65          isDivide
2f7c0 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  r = 1;.        i
2f7d0 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29  f( (--nOverflow)
2f7e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2f7f0 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  iOverflow++;.   
2f800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
2f810 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74        if( i==cnt
2f820 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20  New[k] ){.      
2f830 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
2f840 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
2f850 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
2f860 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e  e last cell on n
2f870 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ew.        ** si
2f880 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66  bling page k. If
2f890 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2f8a0 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
2f8b0 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
2f8c0 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
2f8d0 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20   then cell i is 
2f8e0 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
2f8f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2f900 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20   = apNew[++k];. 
2f910 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66         if( !leaf
2f920 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Data ) continue;
2f930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2f940 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2f950 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
2f960 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a  sert( j<nOld );.
2f970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
2f980 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f  nNew );..      /
2f990 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61  * If the cell wa
2f9a0 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76  s originally div
2f9b0 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69  ider cell (and i
2f9c0 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20  s not now) or.  
2f9d0 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c      ** an overfl
2f9e0 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74  ow cell, or if t
2f9f0 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61  he cell was loca
2fa00 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ted on a differe
2fa10 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20  nt sibling.     
2fa20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20   ** page before 
2fa30 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
2fa40 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20  hen the pointer 
2fa50 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
2fa60 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ciated.      ** 
2fa70 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f  with any child o
2fa80 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
2fa90 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
2faa0 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
2fab0 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20  f( isDivider || 
2fac0 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  pOld->pgno!=pNew
2fad0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
2fae0 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
2faf0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
2fb00 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2fb10 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
2fb20 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d  apCell[i]), PTRM
2fb30 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
2fb40 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  pgno);.        }
2fb50 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
2fb60 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e  ell[i]>pNew->min
2fb70 4c 6f 63 61 6c 20 26 26 20 72 63 3d 3d 53 51 4c  Local && rc==SQL
2fb80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fb90 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2fba0 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20  utOvflPtr(pNew, 
2fbb0 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  apCell[i]);.    
2fbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2fbd0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65    }..    if( !le
2fbe0 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
2fbf0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
2fc00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fc10 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
2fc20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2fc30 70 50 75 74 28 0a 09 20 20 20 20 70 42 74 2c 20  pPut(..    pBt, 
2fc40 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b  get4byte(&apNew[
2fc50 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 50  i]->aData[8]), P
2fc60 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e  TRMAP_BTREE, apN
2fc70 65 77 5b 69 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20  ew[i]->pgno);.  
2fc80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
2fc90 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74   0.    /* The pt
2fca0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 29  rmapCheckPages()
2fcb0 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74   contains assert
2fcc0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
2fcd0 61 74 20 76 65 72 69 66 79 20 74 68 61 74 0a 20  at verify that. 
2fce0 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65     ** all pointe
2fcf0 72 20 6d 61 70 20 70 61 67 65 73 20 61 72 65 20  r map pages are 
2fd00 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54  set correctly. T
2fd10 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77  his is helpful w
2fd20 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62  hile .    ** deb
2fd30 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20  ugging. This is 
2fd40 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64  usually disabled
2fd50 20 62 65 63 61 75 73 65 20 61 20 63 6f 72 72 75   because a corru
2fd60 70 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a  pt database may.
2fd70 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20      ** cause an 
2fd80 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2fd90 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a  nt to fail.  */.
2fda0 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50      ptrmapCheckP
2fdb0 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77  ages(apNew, nNew
2fdc0 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65  );.    ptrmapChe
2fdd0 63 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e 74  ckPages(&pParent
2fde0 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 1);.#endif.  }
2fdf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
2fe00 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ent->isInit );. 
2fe10 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2fe20 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d  : finished: old=
2fe30 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d  %d new=%d cells=
2fe40 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2fe50 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
2fe60 6c 6c 29 29 3b 0a 20 0a 20 20 2f 2a 0a 20 20 2a  ll));. .  /*.  *
2fe70 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
2fe80 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
2fe90 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
2fea0 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  :.  sqlite3Scrat
2feb0 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
2fec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2fed0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
2fee0 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
2fef0 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
2ff00 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2ff10 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2ff20 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
2ff30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ff40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2ff50 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2ff60 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
2ff70 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
2ff80 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
2ff90 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
2ffa0 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
2ffb0 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
2ffc0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
2ffd0 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
2ffe0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
2fff0 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
30000 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
30010 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
30020 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
30030 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
30040 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
30050 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
30060 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
30070 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
30080 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
30090 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
300a0 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
300b0 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
300c0 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
300d0 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
300e0 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
300f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
30100 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
30110 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
30120 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
30130 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
30140 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61  age.aOvfl[] arra
30150 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
30160 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
30170 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
30180 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
30190 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
301a0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
301b0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  BtreeInitPage().
301c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f  .**.** The perfo
301d0 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66  rmance of this f
301e0 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  unction is not c
301f0 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f  ritical. It is o
30200 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  nly used by .** 
30210 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  the balance_shal
30220 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61  lower() and bala
30230 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f  nce_deeper() pro
30240 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72  cedures, neither
30250 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65   of.** which are
30260 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e   called often un
30270 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75  der normal circu
30280 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61  mstances..*/.sta
30290 74 69 63 20 69 6e 74 20 63 6f 70 79 4e 6f 64 65  tic int copyNode
302a0 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20  Content(MemPage 
302b0 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20  *pFrom, MemPage 
302c0 2a 70 54 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  *pTo){.  BtShare
302d0 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
302e0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 75 38  pFrom->pBt;.  u8
302f0 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d   * const aFrom =
30300 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20   pFrom->aData;. 
30310 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
30320 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
30330 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48  int const iFromH
30340 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f  dr = pFrom->hdrO
30350 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 63 6f 6e  ffset;.  int con
30360 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54  st iToHdr = ((pT
30370 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30  o->pgno==1) ? 10
30380 30 20 3a 20 30 29 3b 0a 20 20 69 6e 74 20 72 63  0 : 0);.  int rc
30390 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
303a0 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 61 73  int iData;..  as
303b0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49  sert( pFrom->isI
303c0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
303d0 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69   pFrom->nFree>=i
303e0 54 6f 48 64 72 20 29 3b 0a 20 20 61 73 73 65 72  ToHdr );.  asser
303f0 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72  t( get2byte(&aFr
30400 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3c  om[iFromHdr+5])<
30410 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
30420 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74   );..  /* Copy t
30430 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63  he b-tree node c
30440 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65  ontent from page
30450 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
30460 54 6f 2e 20 2a 2f 0a 20 20 69 44 61 74 61 20 3d  To. */.  iData =
30470 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
30480 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
30490 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
304a0 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
304b0 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
304c0 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 6d 65  ize-iData);.  me
304d0 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72  mcpy(&aTo[iToHdr
304e0 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  ], &aFrom[iFromH
304f0 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c  dr], pFrom->cell
30500 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d  Offset + 2*pFrom
30510 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  ->nCell);..  /* 
30520 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
30530 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
30540 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30550 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
30560 75 72 65 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74  ure.  ** match t
30570 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65  he new data. The
30580 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
30590 6f 66 20 70 54 6f 20 22 63 61 6e 6e 6f 74 22 20  of pTo "cannot" 
305a0 66 61 69 6c 2c 20 61 73 20 74 68 65 0a 20 20 2a  fail, as the.  *
305b0 2a 20 64 61 74 61 20 63 6f 70 69 65 64 20 66 72  * data copied fr
305c0 6f 6d 20 70 46 72 6f 6d 20 69 73 20 6b 6e 6f 77  om pFrom is know
305d0 6e 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 20 20  n to be valid.  
305e0 2a 2f 0a 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74  */.  pTo->isInit
305f0 20 3d 20 30 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   = 0;.  TESTONLY
30600 28 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42  (rc = ) sqlite3B
30610 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f  treeInitPage(pTo
30620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
30630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
30640 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
30650 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
30660 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
30670 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
30680 6e 74 72 69 65 73 0a 20 20 2a 2a 20 66 6f 72 20  ntries.  ** for 
30690 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
306a0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
306b0 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
306c0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
306d0 74 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  to. */.  if( ISA
306e0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
306f0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
30700 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 7d 0a  rmaps(pTo);.  }.
30710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30720 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
30730 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  ne is called on 
30740 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
30750 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74 68   a btree when th
30760 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63  e root.** page c
30770 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
30780 2e 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70  . This is an opp
30790 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65  ortunity to make
307a0 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61   the tree.** sha
307b0 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65  llower by one le
307c0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
307d0 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  nt balance_shall
307e0 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52  ower(MemPage *pR
307f0 6f 6f 74 29 7b 0a 20 20 2f 2a 20 54 68 65 20 72  oot){.  /* The r
30800 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
30810 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
30820 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
30830 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  he.  ** informat
30840 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e  ion from that on
30850 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65  e child into the
30860 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74   root page if it
30870 20 0a 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e   .  ** will fit.
30880 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
30890 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
308a0 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a  tree by one..  *
308b0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f  *.  ** If the ro
308c0 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ot page is page 
308d0 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73  1, it has less s
308e0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74  pace available t
308f0 68 61 6e 0a 20 20 2a 2a 20 69 74 73 20 63 68 69  han.  ** its chi
30900 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31  ld (due to the 1
30910 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74  00 byte header t
30920 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
30930 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
30940 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30950 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67   fle), so it mig
30960 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ht not be able t
30970 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68  o hold all of th
30980 65 20 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  e .  ** informat
30990 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ion currently co
309a0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63  ntained in the c
309b0 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69  hild.  If this i
309c0 73 20 74 68 65 20 0a 20 20 2a 2a 20 63 61 73 65  s the .  ** case
309d0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
309e0 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
309f0 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
30a00 74 79 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 66  ty except.  ** f
30a10 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
30a20 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c  nter to the chil
30a30 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69  d page.  The chi
30a40 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  ld page becomes.
30a50 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
30a60 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
30a70 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  e..  */.  int rc
30a80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30aa0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30ab0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ode */.  int con
30ac0 73 74 20 68 64 72 20 3d 20 70 52 6f 6f 74 2d 3e  st hdr = pRoot->
30ad0 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
30ae0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
30af0 20 72 6f 6f 74 20 70 61 67 65 20 68 65 61 64 65   root page heade
30b00 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
30b10 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  pChild;         
30b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b30 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 69 6c 64 20    /* Only child 
30b40 6f 66 20 70 52 6f 6f 74 20 2a 2f 0a 20 20 50 67  of pRoot */.  Pg
30b50 6e 6f 20 63 6f 6e 73 74 20 70 67 6e 6f 43 68 69  no const pgnoChi
30b60 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
30b70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
30b80 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
30b90 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
30ba0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Root->nCell==0 )
30bb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
30bc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
30bd0 52 6f 6f 74 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Root->pBt->mutex
30be0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
30bf0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  pRoot->leaf );. 
30c00 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
30c10 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
30c20 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67  ( pgnoChild<=pag
30c30 65 72 50 61 67 65 63 6f 75 6e 74 28 70 52 6f 6f  erPagecount(pRoo
30c40 74 2d 3e 70 42 74 29 20 29 3b 0a 20 20 61 73 73  t->pBt) );.  ass
30c50 65 72 74 28 20 68 64 72 3d 3d 30 20 7c 7c 20 70  ert( hdr==0 || p
30c60 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b  Root->pgno==1 );
30c70 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
30c80 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
30c90 52 6f 6f 74 2d 3e 70 42 74 2c 20 70 67 6e 6f 43  Root->pBt, pgnoC
30ca0 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30  hild, &pChild, 0
30cb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
30cc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
30cd0 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
30ce0 3d 68 64 72 20 29 7b 0a 20 20 20 20 20 20 69 66  =hdr ){.      if
30cf0 28 20 68 64 72 20 29 7b 0a 20 20 20 20 20 20 20  ( hdr ){.       
30d00 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
30d10 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
30d20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30d40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f  .        rc = co
30d50 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 43  pyNodeContent(pC
30d60 68 69 6c 64 2c 20 70 52 6f 6f 74 29 3b 0a 20 20  hild, pRoot);.  
30d70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30d90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
30da0 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
30db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
30dc0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
30dd0 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69  child has more i
30de0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
30df0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
30e00 72 6f 6f 74 2e 0a 20 20 20 20 20 20 2a 2a 20 54  root..      ** T
30e10 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61  he tree is alrea
30e20 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f  dy balanced.  Do
30e30 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20   nothing. */.   
30e40 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
30e50 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c  CE: child %d wil
30e60 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67  l not fit on pag
30e70 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
30e80 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
30e90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
30ea0 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  hild);.  }..  re
30eb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
30ec0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
30ed0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
30ee0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
30ef0 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
30f00 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75  ure is.** overfu
30f10 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ll (has one or m
30f20 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
30f30 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  es)..**.** A new
30f40 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61   child page is a
30f50 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
30f60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
30f70 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a   current root.**
30f80 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67   page, including
30f90 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c   overflow cells,
30fa0 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f   are copied into
30fb0 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20   the child. The 
30fc0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
30fd0 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e  then overwritten
30fe0 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65   to make it an e
30ff0 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74  mpty page with t
31000 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a  he right-child .
31010 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ** pointer point
31020 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70  ing to the new p
31030 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  age..**.** Befor
31040 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c  e returning, all
31050 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31060 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
31070 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20  ng to pages .** 
31080 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69  that the new chi
31090 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74  ld-page now cont
310a0 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
310b0 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68   are updated. Th
310c0 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65  e.** entry corre
310d0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
310e0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
310f0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72  pointer of the r
31100 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  oot.** page is a
31110 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  lso updated..**.
31120 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
31130 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  , *ppChild is se
31140 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72  t to contain a r
31150 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
31160 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61  child .** page a
31170 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
31180 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
31190 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
311a0 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  r is required.**
311b0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
311c0 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69  Page() on *ppChi
311d0 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ld exactly once.
311e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
311f0 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
31200 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
31210 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69  d and *ppChild i
31220 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
31230 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
31240 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
31250 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65   *pRoot, MemPage
31260 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69   **ppChild){.  i
31270 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
31280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31290 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
312a0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
312b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
312c0 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
312d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
312e0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
312f0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
31300 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  noChild;        
31310 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31320 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
31330 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
31340 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
31350 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20  = pRoot->pBt;   
31360 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
31370 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
31380 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  t->nOverflow>0 )
31390 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
313a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
313b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
313c0 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20   /* Make pRoot, 
313d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
313e0 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69   the b-tree, wri
313f0 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20  table. Allocate 
31400 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65  a new .  ** page
31410 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
31420 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  e the new right-
31430 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20  child of pPage. 
31440 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
31450 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f  s.  ** of the no
31460 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f  de stored on pRo
31470 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  ot into the new 
31480 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f  child page..  */
31490 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
314a0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
314b0 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
314c0 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c  >pDbPage)).   ||
314d0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
314e0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
314f0 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c  age(pBt,&pChild,
31500 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74  &pgnoChild,pRoot
31510 2d 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c  ->pgno,0)).   ||
31520 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
31530 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  = copyNodeConten
31540 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29  t(pRoot, pChild)
31550 29 0a 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56  ).   || (ISAUTOV
31560 41 43 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20  ACUUM && .      
31570 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
31580 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
31590 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d   pgnoChild, PTRM
315a0 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d  AP_BTREE, pRoot-
315b0 3e 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20  >pgno))).  ){.  
315c0 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a    *ppChild = 0;.
315d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
315e0 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74  pChild);.    ret
315f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
31600 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
31610 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
31620 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
31630 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
31640 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31650 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
31660 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
31670 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d   pChild->nCell==
31680 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pRoot->nCell );.
31690 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
316a0 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
316b0 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f   into %d\n", pRo
316c0 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ot->pgno, pChild
316d0 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20  ->pgno));..  /* 
316e0 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f  Copy the overflo
316f0 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f  w cells from pRo
31700 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a  ot to pChild */.
31710 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
31720 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61  >aOvfl, pRoot->a
31730 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76  Ovfl, pRoot->nOv
31740 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52  erflow*sizeof(pR
31750 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b  oot->aOvfl[0]));
31760 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
31770 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f  flow = pRoot->nO
31780 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a  verflow;..  /* Z
31790 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ero the contents
317a0 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20   of pRoot. Then 
317b0 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61  install pChild a
317c0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
317d0 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65  d. */.  zeroPage
317e0 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e  (pRoot, pChild->
317f0 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
31800 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
31810 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
31820 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
31830 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
31840 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70  ..  *ppChild = p
31850 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Child;.  return 
31860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
31870 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61  .** The page tha
31880 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79  t pCur currently
31890 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a   points to has j
318a0 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ust been modifie
318b0 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79  d in.** some way
318c0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
318d0 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74  figures out if t
318e0 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  his modification
318f0 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72   means the.** tr
31900 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ee needs to be b
31910 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20  alanced, and if 
31920 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70  so calls the app
31930 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
31940 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20  ng .** routine. 
31950 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  Balancing routin
31960 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
31970 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a  balance_quick().
31980 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 73 68 61  **   balance_sha
31990 6c 6c 6f 77 65 72 28 29 0a 2a 2a 20 20 20 62 61  llower().**   ba
319a0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a  lance_deeper().*
319b0 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  *   balance_nonr
319c0 6f 6f 74 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62  oot().**.** If b
319d0 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45  uilt with SQLITE
319e0 5f 44 45 42 55 47 2c 20 70 43 75 72 2d 3e 70 61  _DEBUG, pCur->pa
319f0 67 65 73 53 68 75 66 66 6c 65 64 20 69 73 20 73  gesShuffled is s
31a00 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 0a 2a  et to true if .*
31a10 2a 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  * balance_shallo
31a20 77 65 72 28 29 2c 20 62 61 6c 61 6e 63 65 5f 64  wer(), balance_d
31a30 65 65 70 65 72 28 29 20 6f 72 20 62 61 6c 61 6e  eeper() or balan
31a40 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 69 73 20  ce_nonroot() is 
31a50 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 6e 6f  called..** If no
31a60 6e 65 20 6f 66 20 74 68 65 73 65 20 66 75 6e 63  ne of these func
31a70 74 69 6f 6e 73 20 61 72 65 20 69 6e 76 6f 6b 65  tions are invoke
31a80 64 2c 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  d, pCur->pagesSh
31a90 75 66 66 6c 65 64 20 69 73 20 6c 65 66 74 0a 2a  uffled is left.*
31aa0 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  * unmodified..*/
31ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
31ac0 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
31ad0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
31ae0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e  SQLITE_OK;.  con
31af0 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43  st int nMin = pC
31b00 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ur->pBt->usableS
31b10 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75  ize * 2 / 3;.  u
31b20 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  8 aBalanceQuickS
31b30 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a  pace[13];.  u8 *
31b40 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45  pFree = 0;..  TE
31b50 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61  STONLY( int bala
31b60 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
31b70 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e   = 0 );.  TESTON
31b80 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
31b90 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20  deeper_called = 
31ba0 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  0 );..  do {.   
31bb0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
31bc0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65  r->iPage;.    Me
31bd0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
31be0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
31bf0 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61  e];..    if( iPa
31c00 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ge==0 ){.      i
31c10 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
31c20 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  low ){.        /
31c30 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
31c40 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  of the b-tree is
31c50 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68   overfull. In th
31c60 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65  is case call the
31c70 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
31c80 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e  nce_deeper() fun
31c90 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ction to create 
31ca0 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20  a new child for 
31cb0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
31cc0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70        ** and cop
31cd0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  y the current co
31ce0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
31cf0 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54  ot-page to it. T
31d00 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  he.        ** ne
31d10 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
31d20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
31d30 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69   balance the chi
31d40 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ld page..       
31d50 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73   */ .        ass
31d60 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65  ert( (balance_de
31d70 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  eper_called++)==
31d80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
31d90 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
31da0 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61  (pPage, &pCur->a
31db0 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20  pPage[1]);.     
31dc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31dd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31de0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
31df0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  1;.          pCu
31e00 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
31e10 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
31e20 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20  >aiIdx[1] = 0;. 
31e30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31e40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
31e50 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
31e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31e70 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
31e80 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
31e90 20 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   1 );.      }els
31ea0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
31eb0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
31ec0 68 65 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 77  he b-tree is now
31ed0 20 65 6d 70 74 79 2e 20 49 66 20 74 68 65 20 72   empty. If the r
31ee0 6f 6f 74 2d 70 61 67 65 20 69 73 20 6e 6f 74 0a  oot-page is not.
31ef0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20          ** also 
31f00 61 20 6c 65 61 66 20 70 61 67 65 2c 20 69 74 20  a leaf page, it 
31f10 77 69 6c 6c 20 68 61 76 65 20 61 20 73 69 6e 67  will have a sing
31f20 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 43  le child page. C
31f30 61 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  all .        ** 
31f40 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
31f50 72 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  r to attempt to 
31f60 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
31f70 73 20 6f 66 20 74 68 65 20 73 69 6e 67 6c 65 0a  s of the single.
31f80 20 20 20 20 20 20 20 20 2a 2a 20 63 68 69 6c 64          ** child
31f90 2d 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 72  -page into the r
31fa0 6f 6f 74 20 70 61 67 65 20 28 74 68 69 73 20 6d  oot page (this m
31fb0 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
31fc0 6c 65 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  le if the.      
31fd0 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69    ** root page i
31fe0 73 20 70 61 67 65 20 31 29 2e 0a 20 20 20 20 20  s page 1)..     
31ff0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32000 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
32010 74 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65  this is possible
32020 20 2c 20 74 68 65 20 74 72 65 65 20 69 73 20 6e   , the tree is n
32030 6f 77 20 62 61 6c 61 6e 63 65 64 2e 20 0a 20 20  ow balanced. .  
32040 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 66 6f        ** Therefo
32050 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 69 74  re is no next it
32060 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
32070 6f 2d 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 20 20  o-loop..        
32080 2a 2f 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  */ .        if( 
32090 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
320a0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
320b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
320c0 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  = balance_shallo
320d0 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  wer(pPage);.    
320e0 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
320f0 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
32100 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 20  led = 1 );.     
32110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
32120 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
32130 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d  }else if( pPage-
32140 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
32150 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e   pPage->nFree<=n
32160 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65  Min ){.      bre
32170 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
32180 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63       MemPage * c
32190 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70  onst pParent = p
321a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
321b0 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  e-1];.      int 
321c0 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75  const iIdx = pCu
321d0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31  r->aiIdx[iPage-1
321e0 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ];..      rc = s
321f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32200 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
32210 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
32220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
32230 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32240 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
32250 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
32260 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20  e->hasData.     
32270 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f      && pPage->nO
32280 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20  verflow==1.     
32290 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f      && pPage->aO
322a0 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
322b0 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  e->nCell.       
322c0 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67    && pParent->pg
322d0 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26  no!=1.         &
322e0 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
322f0 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29  ==iIdx.        )
32300 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
32310 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  all balance_quic
32320 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20  k() to create a 
32330 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70  new sibling of p
32340 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20  Page on which.  
32350 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74          ** to st
32360 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ore the overflow
32370 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71   cell. balance_q
32380 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61  uick() inserts a
32390 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20   new cell.      
323a0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72      ** into pPar
323b0 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
323c0 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65  ause pParent ove
323d0 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20  rflow. If this. 
323e0 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70           ** happ
323f0 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e  ens, the next in
32400 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
32410 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
32420 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20  ance pParent .  
32430 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65          ** use e
32440 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f  ither balance_no
32450 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e  nroot() or balan
32460 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74  ce_deeper(). Unt
32470 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  il this.        
32480 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68    ** happens, th
32490 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
324a0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
324b0 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
324c0 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  ace[].          
324d0 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  ** buffer. .    
324e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
324f0 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73     ** The purpos
32500 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
32510 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74  ng assert() is t
32520 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c  o check that onl
32530 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y a.          **
32540 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20   single call to 
32550 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
32560 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68  is made for each
32570 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
32580 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
32590 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72  ion. If this wer
325a0 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20  e not verified, 
325b0 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76  a subtle bug inv
325c0 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20  olving reuse.   
325d0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
325e0 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
325f0 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61  ace[] might snea
32600 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  k in..          
32610 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
32620 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75  ert( (balance_qu
32630 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  ick_called++)==0
32640 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
32650 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b   = balance_quick
32660 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c  (pParent, pPage,
32670 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
32680 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ace);.        }e
32690 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
326a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f     {.          /
326b0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
326c0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  call balance_non
326d0 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74  root() to redist
326e0 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20  ribute cells.   
326f0 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
32700 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
32710 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69  o 2 of its sibli
32720 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69  ng pages. This i
32730 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20  nvolves.        
32740 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74    ** modifying t
32750 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
32760 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61  Parent, which ma
32770 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20  y cause pParent 
32780 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
32790 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
327a0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68  or underfull. Th
327b0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
327c0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a   of the do-loop.
327d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c            ** wil
327e0 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61  l balance the pa
327f0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72  rent page to cor
32800 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20  rect this..     
32810 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
32820 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72     ** If the par
32830 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
32840 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f   overfull, the o
32850 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20  verflow cell or 
32860 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20  cells.          
32870 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
32880 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
32890 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d  er allocated imm
328a0 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20  ediately below. 
328b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20  .          ** A 
328c0 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
328d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
328e0 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69  oop will deal wi
328f0 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20  th this by.     
32900 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
32910 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
32920 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ) (balance_deepe
32930 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  r() may be calle
32940 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20  d first,.       
32950 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65     ** but it doe
32960 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f  sn't deal with o
32970 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20  verflow cells - 
32980 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20  just moves them 
32990 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  to a.          *
329a0 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  * different page
329b0 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62  ). Once this sub
329c0 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
329d0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
329e0 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ) .          ** 
329f0 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69  has completed, i
32a00 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c  t is safe to rel
32a10 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20  ease the pSpace 
32a20 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20  buffer used by. 
32a30 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
32a40 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61  previous call, a
32a50 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  s the overflow c
32a60 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61  ell data will ha
32a70 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  ve been .       
32a80 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74     ** copied eit
32a90 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  her into the bod
32aa0 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  y of a database 
32ab0 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65  page or into the
32ac0 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a   new.          *
32ad0 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  * pSpace buffer 
32ae0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61  passed to the la
32af0 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c  tter call to bal
32b00 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a  ance_nonroot()..
32b10 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
32b20 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63         u8 *pSpac
32b30 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
32b40 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d  alloc(pCur->pBt-
32b50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
32b60 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
32b70 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65  ce_nonroot(pPare
32b80 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65  nt, iIdx, pSpace
32b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32ba0 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
32bb0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65        /* If pFre
32bc0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  e is not NULL, i
32bd0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
32be0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73  pSpace buffer us
32bf0 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed .            
32c00 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f 75 73  ** by a previous
32c10 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
32c20 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20  _nonroot(). Its 
32c30 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20  contents are.   
32c40 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20           ** now 
32c50 73 74 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e  stored either on
32c60 20 72 65 61 6c 20 64 61 74 61 62 61 73 65 20 70   real database p
32c70 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74  ages or within t
32c80 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
32c90 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20 62 75  ** new pSpace bu
32ca0 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20  ffer, so it may 
32cb0 62 65 20 73 61 66 65 6c 79 20 66 72 65 65 64 20  be safely freed 
32cc0 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
32cd0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
32ce0 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Free(pFree);.   
32cf0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
32d00 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63      /* The pSpac
32d10 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65  e buffer will be
32d20 20 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65   freed after the
32d30 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20   next call to.  
32d40 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
32d50 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72  ce_nonroot(), or
32d60 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 69   just before thi
32d70 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
32d80 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20  ns, whichever.  
32d90 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73          ** comes
32da0 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20   first. */.     
32db0 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53 70       pFree = pSp
32dc0 61 63 65 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ace;.          V
32dd0 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70  VA_ONLY( pCur->p
32de0 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31  agesShuffled = 1
32df0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
32e00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
32e10 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
32e20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  0;..      /* The
32e30 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
32e40 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62  of the do-loop b
32e50 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72 65  alances the pare
32e60 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
32e70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
32e80 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72  age);.      pCur
32e90 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->iPage--;.    }
32ea0 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
32eb0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
32ec0 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
32ed0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
32ee0 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFree);.  }.  re
32ef0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
32f00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
32f10 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72  hecks all cursor
32f20 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
32f30 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  table pgnoRoot..
32f40 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f  ** If any of tho
32f50 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20  se cursors were 
32f60 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
32f70 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65  ag==0 in a diffe
32f80 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65  rent.** database
32f90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64   connection (a d
32fa0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
32fb0 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74  on that shares t
32fc0 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68  he pager.** cach
32fd0 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  e with the curre
32fe0 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61  nt connection) a
32ff0 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f  nd that other co
33000 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nnection .** is 
33010 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55  not in the ReadU
33020 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74  ncommmitted stat
33030 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
33040 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tine returns .**
33050 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
33060 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  **.** As well as
33070 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72   cursors with wr
33080 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73  Flag==0, cursors
33090 20 77 69 74 68 20 0a 2a 2a 20 69 73 49 6e 63 72   with .** isIncr
330a0 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72  blobHandle==1 ar
330b0 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65  e also considere
330c0 64 20 27 72 65 61 64 27 20 63 75 72 73 6f 72 73  d 'read' cursors
330d0 20 62 65 63 61 75 73 65 0a 2a 2a 20 69 6e 63 72   because.** incr
330e0 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
330f0 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f  sors are used fo
33100 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
33110 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  nd writing..**.*
33120 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20  * When pgnoRoot 
33130 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
33140 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   of an intkey ta
33150 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ble, this functi
33160 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  on is also.** re
33170 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e  sponsible for in
33180 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65  validating incre
33190 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
331a0 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62  ors when the tab
331b0 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69  le row.** on whi
331c0 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e  ch they are open
331d0 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72  ed is deleted or
331e0 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f   modified. Curso
331f0 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
33200 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20  ed.** according 
33210 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
33220 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
33230 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65  1) When BtreeCle
33240 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c  arTable() is cal
33250 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  led to completel
33260 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e  y delete the con
33270 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66  tents.**      of
33280 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c   a B-Tree table,
33290 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
332a0 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72   to zero and par
332b0 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a  ameter iRow is .
332c0 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e  **      set to n
332d0 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  on-zero. In this
332e0 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d   case all increm
332f0 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
33300 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20  rs open.**      
33310 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  on the table roo
33320 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  ted at pgnoRoot 
33330 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
33340 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
33350 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20   BtreeInsert(), 
33360 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
33370 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20   BtreePutData() 
33380 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a  is called to .**
33390 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74        modify a t
333a0 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20  able row via an 
333b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70  SQL statement, p
333c0 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
333d0 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77  o the .**      w
333e0 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64  rite cursor used
333f0 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66   to do the modif
33400 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61  ication and para
33410 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65  meter iRow is se
33420 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  t.**      to the
33430 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20   integer row id 
33440 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e  of the B-Tree en
33450 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  try being modifi
33460 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20  ed. Unless.**   
33470 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69     pExclude is i
33480 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65  tself an increme
33490 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
334a0 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65  , then all incre
334b0 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62  mental.**      b
334c0 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
334d0 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20   on row iRow of 
334e0 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69  the B-Tree are i
334f0 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a  nvalidated..**.*
33500 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70  *   3) If both p
33510 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77  Exclude and iRow
33520 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f   are set to zero
33530 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  , no incremental
33540 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63   blob .**      c
33550 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
33560 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
33570 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65  c int checkForRe
33580 61 64 43 6f 6e 66 6c 69 63 74 73 28 0a 20 20 42  adConflicts(.  B
33590 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
335a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
335b0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
335c0 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  heck */.  Pgno p
335d0 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  gnoRoot,        
335e0 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 65    /* Look for re
335f0 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ad cursors on th
33600 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74  is btree */.  Bt
33610 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65  Cursor *pExclude
33620 2c 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  ,     /* Ignore 
33630 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
33640 20 69 36 34 20 69 52 6f 77 20 20 20 20 20 20 20   i64 iRow       
33650 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
33660 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
33670 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
33680 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
33690 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
336a0 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b  t = pBtree->pBt;
336b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
336c0 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61   pBtree->db;.  a
336d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
336e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
336f0 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
33700 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
33710 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
33720 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75     if( p==pExclu
33730 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  de ) continue;. 
33740 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
33750 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63  ot!=pgnoRoot ) c
33760 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
33770 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
33780 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70 2d  RBLOB.    if( p-
33790 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
337a0 65 20 26 26 20 28 20 0a 20 20 20 20 20 20 20 20  e && ( .        
337b0 20 28 21 70 45 78 63 6c 75 64 65 20 26 26 20 69   (!pExclude && i
337c0 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28 70  Row).      || (p
337d0 45 78 63 6c 75 64 65 20 26 26 20 21 70 45 78 63  Exclude && !pExc
337e0 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  lude->isIncrblob
337f0 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66  Handle && p->inf
33800 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20  o.nKey==iRow).  
33810 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65    )){.      p->e
33820 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
33830 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65  NVALID;.    }.#e
33840 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
33850 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
33860 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ALID ) continue;
33870 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c  .    if( p->wrFl
33880 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20 53  ag==0 .#ifndef S
33890 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
338a0 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69  LOB.     || p->i
338b0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a  sIncrblobHandle.
338c0 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
338d0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f      sqlite3 *dbO
338e0 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65  ther = p->pBtree
338f0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 61 73 73 65  ->db;.      asse
33900 72 74 28 64 62 4f 74 68 65 72 29 3b 0a 20 20 20  rt(dbOther);.   
33910 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 21 3d     if( dbOther!=
33920 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e  db && (dbOther->
33930 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
33940 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d  eadUncommitted)=
33950 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
33960 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
33970 6c 6f 63 6b 65 64 28 64 62 2c 20 64 62 4f 74 68  locked(db, dbOth
33980 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  er);.        ret
33990 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
339a0 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
339b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
339c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
339d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
339e0 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
339f0 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65  d into the BTree
33a00 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69  .  The key is gi
33a10 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65  ven by (pKey,nKe
33a20 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  y).** and the da
33a30 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ta is given by (
33a40 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54  pData,nData).  T
33a50 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
33a60 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66  d only to.** def
33a70 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74  ine what table t
33a80 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
33a90 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
33aa0 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
33ab0 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
33ac0 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
33ad0 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ocation..**.** F
33ae0 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
33af0 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  le, only the nKe
33b00 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b  y value of the k
33b10 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  ey is used.  pKe
33b20 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
33b30 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41    For a ZERODATA
33b40 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74   table, the pDat
33b50 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20  a and nData are 
33b60 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  both ignored..**
33b70 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52  .** If the seekR
33b80 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
33b90 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
33ba0 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63  n a successful c
33bb0 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  all to.** sqlite
33bc0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 74  3BtreeMoveto() t
33bd0 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43  o seek cursor pC
33be0 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65  ur to (pKey, nKe
33bf0 79 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  y) has already.*
33c00 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64  * been performed
33c10 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20  . seekResult is 
33c20 74 68 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  the search resul
33c30 74 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65  t returned (a ne
33c40 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72  gative.** number
33c50 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20   if pCur points 
33c60 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
33c70 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
33c80 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f   (pKey, nKey), o
33c90 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20  r.** a positive 
33ca0 76 61 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f  value if pCur po
33cb0 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79 20  ints at an etry 
33cc0 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
33cd0 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e  han .** (pKey, n
33ce0 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Key)). .**.** If
33cf0 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20   the seekResult 
33d00 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
33d10 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72  then cursor pCur
33d20 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e   may point to an
33d30 79 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72 20 74  y .** entry or t
33d40 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c  o no entry at al
33d50 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  l. In this case 
33d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
33d70 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65  s to seek.** the
33d80 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20 74   cursor before t
33d90 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20 62  he new key can b
33da0 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
33db0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
33dc0 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
33dd0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
33de0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
33df0 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
33e00 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
33e10 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
33e20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
33e30 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
33e40 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
33e50 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
33e60 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
33e70 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
33e80 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
33e90 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
33ea0 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
33eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
33ec0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
33ed0 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
33ee0 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
33ef0 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20  t appendBias,   
33f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f10 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
33f20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
33f30 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65   */.  int seekRe
33f40 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
33f50 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
33f60 66 20 70 72 69 6f 72 20 73 71 6c 69 74 65 33 42  f prior sqlite3B
33f70 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 63 61 6c  treeMoveto() cal
33f80 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  l */.){.  int rc
33f90 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65  ;.  int loc = se
33fa0 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20  ekResult;.  int 
33fb0 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78  szNew;.  int idx
33fc0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
33fd0 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  ge;.  Btree *p =
33fe0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
33ff0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
34000 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
34010 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c  ned char *oldCel
34020 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
34030 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b  ar *newCell = 0;
34040 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
34050 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
34060 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
34070 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
34080 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
34090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
340a0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
340b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77   assert( pCur->w
340c0 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20  rFlag );.  rc = 
340d0 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66  checkForReadConf
340e0 6c 69 63 74 73 28 70 43 75 72 2d 3e 70 42 74 72  licts(pCur->pBtr
340f0 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ee, pCur->pgnoRo
34100 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 3b  ot, pCur, nKey);
34110 0a 20 20 69 66 28 20 72 63 20 29 7b 20 20 20 20  .  if( rc ){    
34120 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a           .    /*
34130 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
34140 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
34150 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
34160 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
34170 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
34180 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65  DCACHE );.    re
34190 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
341a0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
341b0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
341c0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
341d0 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ->skip;.  }..  /
341e0 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
341f0 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
34200 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  r cursors open o
34210 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20  n this table..  
34220 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20  **.  ** In some 
34230 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 20  cases, the call 
34240 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  to sqlite3BtreeM
34250 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73  oveto() below is
34260 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20   a no-op. For.  
34270 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  ** example, when
34280 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20   inserting data 
34290 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  into a table wit
342a0 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  h auto-generated
342b0 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65   integer.  ** ke
342c0 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79  ys, the VDBE lay
342d0 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  er invokes sqlit
342e0 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f  e3BtreeLast() to
342f0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
34300 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65  .  ** integer ke
34310 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65  y to use. It the
34320 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  n calls this fun
34330 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c  ction to actuall
34340 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20  y insert the .  
34350 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  ** data into the
34360 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20   intkey B-Tree. 
34370 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 71 6c  In this case sql
34380 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
34390 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a  ) recognizes.  *
343a0 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
343b0 72 20 69 73 20 61 6c 72 65 61 64 79 20 77 68 65  r is already whe
343c0 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  re it needs to b
343d0 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69  e and returns wi
343e0 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67  thout.  ** doing
343f0 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76   any work. To av
34400 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20 74 68  oid thwarting th
34410 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
34420 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  s, it is importa
34430 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63  nt.  ** not to c
34440 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f 72 20  lear the cursor 
34450 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  here..  */.  if(
34460 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
34470 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
34480 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
34490 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
344a0 20 7c 7c 20 28 21 6c 6f 63 20 26 26 0a 20 20 20   || (!loc &&.   
344b0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
344c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
344d0 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
344e0 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
344f0 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 29 7b 0a  s, &loc)).  )){.
34500 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34510 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
34520 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
34530 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
34540 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
34550 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
34560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34570 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
34580 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52 41 43  intKey );.  TRAC
34590 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c  E(("INSERT: tabl
345a0 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e  e=%d nkey=%lld n
345b0 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20  data=%d page=%d 
345c0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
345d0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
345e0 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50   nKey, nData, pP
345f0 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  age->pgno,.     
34600 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f       loc==0 ? "o
34610 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77  verwrite" : "new
34620 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73   entry"));.  ass
34630 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
34640 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65  it );.  allocate
34650 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
34660 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d    newCell = pBt-
34670 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66  >pTmpSpace;.  if
34680 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
34690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
346a0 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
346b0 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
346c0 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
346d0 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
346e0 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a  nZero, &szNew);.
346f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34700 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73  end_insert;.  as
34710 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c  sert( szNew==cel
34720 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
34730 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  newCell) );.  as
34740 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f  sert( szNew<=MX_
34750 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
34760 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  ;.  idx = pCur->
34770 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
34780 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30  e];.  if( loc==0
34790 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   && CURSOR_VALID
347a0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
347b0 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
347c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
347d0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
347e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
347f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
34800 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
34810 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
34820 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
34830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
34840 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
34850 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
34860 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
34870 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
34880 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
34890 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
348a0 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
348b0 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
348c0 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
348d0 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
348e0 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  oldCell);.    if
348f0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
34900 69 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d  insert;.    rc =
34910 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
34920 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20   idx, szOld);.  
34930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34940 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 67 6f  _OK ) {.      go
34950 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
34960 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
34970 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
34980 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
34990 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
349a0 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  eaf );.    idx =
349b0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
349c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d  Cur->iPage];.  }
349d0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
349e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
349f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
34a00 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
34a10 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
34a20 77 2c 20 30 2c 20 30 29 3b 0a 20 20 61 73 73 65  w, 0, 0);.  asse
34a30 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
34a40 4b 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K || pPage->nCel
34a50 6c 3e 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  l>0 || pPage->nO
34a60 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20  verflow>0 );..  
34a70 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68  /* If no error h
34a80 61 73 20 6f 63 63 75 72 65 64 20 61 6e 64 20 70  as occured and p
34a90 50 61 67 65 20 68 61 73 20 61 6e 20 6f 76 65 72  Page has an over
34aa0 66 6c 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c 20  flow cell, call 
34ab0 62 61 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a 20  balance() .  ** 
34ac0 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20  to redistribute 
34ad0 74 68 65 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  the cells within
34ae0 20 74 68 65 20 74 72 65 65 2e 20 53 69 6e 63 65   the tree. Since
34af0 20 62 61 6c 61 6e 63 65 28 29 20 6d 61 79 20 6d   balance() may m
34b00 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
34b10 73 6f 72 2c 20 7a 65 72 6f 20 74 68 65 20 42 74  sor, zero the Bt
34b20 43 75 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a  Cursor.info.nSiz
34b30 65 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 76  e and BtCursor.v
34b40 61 6c 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76 61  alidNKey.  ** va
34b50 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20  riables..  **.  
34b60 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  ** Previous vers
34b70 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
34b80 61 6c 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f 74  alled moveToRoot
34b90 28 29 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63  () to move the c
34ba0 75 72 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b 20  ursor.  ** back 
34bb0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
34bc0 20 61 73 20 62 61 6c 61 6e 63 65 28 29 20 75 73   as balance() us
34bd0 65 64 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ed to invalidate
34be0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
34bf0 2a 2a 20 6f 66 20 42 74 43 75 72 73 6f 72 2e 61  ** of BtCursor.a
34c00 70 50 61 67 65 5b 5d 20 61 6e 64 20 42 74 43 75  pPage[] and BtCu
34c10 72 73 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 54 68  rsor.aiIdx[]. Th
34c20 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  is is no longer 
34c30 6e 65 63 65 73 73 61 72 79 2c 0a 20 20 2a 2a 20  necessary,.  ** 
34c40 61 73 20 62 61 6c 61 6e 63 65 28 29 20 61 6c 77  as balance() alw
34c50 61 79 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  ays leaves the c
34c60 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
34c70 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  o a valid entry.
34c80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65  .  **.  ** There
34c90 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74   is a subtle but
34ca0 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d   important optim
34cb0 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f  ization here too
34cc0 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  . When inserting
34cd0 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72  .  ** multiple r
34ce0 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69  ecords into an i
34cf0 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69  ntkey b-tree usi
34d00 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73  ng a single curs
34d10 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20  or (as can.  ** 
34d20 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f  happen while pro
34d30 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45  cessing an "INSE
34d40 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45  RT INTO ... SELE
34d50 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20  CT" statement), 
34d60 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e  it.  ** is advan
34d70 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65  tageous to leave
34d80 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
34d90 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
34da0 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74   entry in.  ** t
34db0 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73  he b-tree if pos
34dc0 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75  sible. If the cu
34dd0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
34de0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
34df0 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20  t.  ** entry in 
34e00 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  the table, and t
34e10 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65  he next row inse
34e20 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65  rted has an inte
34e30 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72  ger key.  ** lar
34e40 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
34e50 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65  gest existing ke
34e60 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  y, it is possibl
34e70 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a  e to insert the.
34e80 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74    ** row without
34e90 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72   seeking the cur
34ea0 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65  sor. This can be
34eb0 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
34ec0 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20  ce boost..  */. 
34ed0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
34ee0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
34ef0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
34f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34f10 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
34f20 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 75  rflow ){.    pCu
34f30 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
34f40 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
34f50 70 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  pCur);..    /* M
34f60 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f  ust make sure nO
34f70 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74  verflow is reset
34f80 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66   to zero even if
34f90 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20   the balance(). 
34fa0 20 20 20 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e     ** fails.  In
34fb0 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
34fc0 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
34fd0 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68   will result oth
34fe0 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 20 20 70  erwise. */.    p
34ff0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
35000 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66  ->iPage]->nOverf
35010 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  low = 0;.  }.  a
35020 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
35030 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
35040 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
35050 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20  ;..end_insert:. 
35060 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35070 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
35080 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63  entry that the c
35090 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
350a0 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  g to.  The curso
350b0 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
350c0 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69 74  nting at a arbit
350d0 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rary location..*
350e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
350f0 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f  eeDelete(BtCurso
35100 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
35110 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
35120 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
35130 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
35140 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
35150 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
35160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35170 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
35180 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  de */.  MemPage 
35190 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
351a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
351b0 50 61 67 65 20 74 6f 20 64 65 6c 65 74 65 20 63  Page to delete c
351c0 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 6e  ell from */.  un
351d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
351e0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
351f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
35200 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
35210 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 49 64  */.  int iCellId
35220 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
35230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
35240 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20 64 65  ex of cell to de
35250 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  lete */.  int iC
35260 65 6c 6c 44 65 70 74 68 3b 20 20 20 20 20 20 20  ellDepth;       
35270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35280 2a 20 44 65 70 74 68 20 6f 66 20 6e 6f 64 65 20  * Depth of node 
35290 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c 6c  containing pCell
352a0 20 2a 2f 20 0a 0a 20 20 61 73 73 65 72 74 28 20   */ ..  assert( 
352b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
352c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
352d0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
352e0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
352f0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
35300 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
35310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
35320 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 69  r->wrFlag );.  i
35330 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61  f( NEVER(pCur->a
35340 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
35350 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]>=pCur->apPage[
35360 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
35370 65 6c 6c 29 20 0a 20 20 20 7c 7c 20 4e 45 56 45  ell) .   || NEVE
35380 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  R(pCur->eState!=
35390 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 20 20  CURSOR_VALID).  
353a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
353b0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
353c0 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 67 6f  Something has go
353d0 6e 65 20 61 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a  ne awry. */.  }.
353e0 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72  .  rc = checkFor
353f0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
35400 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
35410 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66   pCur, pCur->inf
35420 6f 2e 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 72  o.nKey);.  if( r
35430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35440 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
35450 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
35460 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20  AREDCACHE );.   
35470 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
35480 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
35490 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
354a0 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
354b0 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 43 65  ck */.  }..  iCe
354c0 6c 6c 44 65 70 74 68 20 3d 20 70 43 75 72 2d 3e  llDepth = pCur->
354d0 69 50 61 67 65 3b 0a 20 20 69 43 65 6c 6c 49 64  iPage;.  iCellId
354e0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
354f0 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70  iCellDepth];.  p
35500 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
35510 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b  age[iCellDepth];
35520 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
35530 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
35540 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Idx);..  /* If t
35550 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69  he page containi
35560 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  ng the entry to 
35570 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20  delete is not a 
35580 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f 76 65 0a  leaf page, move.
35590 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
355a0 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  to the largest e
355b0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
355c0 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72   that is smaller
355d0 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65   than.  ** the e
355e0 6e 74 72 79 20 62 65 69 6e 67 20 64 65 6c 65 74  ntry being delet
355f0 65 64 2e 20 54 68 69 73 20 63 65 6c 6c 20 77 69  ed. This cell wi
35600 6c 6c 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  ll replace the c
35610 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
35620 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  d.  ** from the 
35630 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54  internal node. T
35640 68 65 20 27 70 72 65 76 69 6f 75 73 27 20 65 6e  he 'previous' en
35650 74 72 79 20 69 73 20 75 73 65 64 20 66 6f 72 20  try is used for 
35660 74 68 69 73 20 69 6e 73 74 65 61 64 0a 20 20 2a  this instead.  *
35670 2a 20 6f 66 20 74 68 65 20 27 6e 65 78 74 27 20  * of the 'next' 
35680 65 6e 74 72 79 2c 20 61 73 20 74 68 65 20 70 72  entry, as the pr
35690 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 73 20  evious entry is 
356a0 61 6c 77 61 79 73 20 61 20 70 61 72 74 20 6f 66  always a part of
356b0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 2d 74 72   the.  ** sub-tr
356c0 65 65 20 68 65 61 64 65 64 20 62 79 20 74 68 65  ee headed by the
356d0 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20 74   child page of t
356e0 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  he cell being de
356f0 6c 65 74 65 64 2e 20 54 68 69 73 20 6d 61 6b 65  leted. This make
35700 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  s.  ** balancing
35710 20 74 68 65 20 74 72 65 65 20 66 6f 6c 6c 6f 77   the tree follow
35720 69 6e 67 20 74 68 65 20 64 65 6c 65 74 65 20 6f  ing the delete o
35730 70 65 72 61 74 69 6f 6e 20 65 61 73 69 65 72 2e  peration easier.
35740 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
35750 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
35760 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
35770 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
35780 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
35790 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
357a0 26 6e 6f 74 55 73 65 64 29 29 20 29 7b 0a 20 20  &notUsed)) ){.  
357b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
357c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
357d0 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
357e0 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
357f0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
35800 68 69 73 20 74 61 62 6c 65 20 62 65 66 6f 72 65  his table before
35810 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e 79  .  ** making any
35820 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 2e 20   modifications. 
35830 4d 61 6b 65 20 74 68 65 20 70 61 67 65 20 63 6f  Make the page co
35840 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74  ntaining the ent
35850 72 79 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 64  ry to be .  ** d
35860 65 6c 65 74 65 64 20 77 72 69 74 61 62 6c 65 2e  eleted writable.
35870 20 54 68 65 6e 20 66 72 65 65 20 61 6e 79 20 6f   Then free any o
35880 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
35890 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
358a0 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79 20 61 6e  e .  ** entry an
358b0 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f 76 65  d finally remove
358c0 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66   the cell itself
358d0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
358e0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28   page.  */.  if(
358f0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
35900 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
35910 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
35920 52 6f 6f 74 2c 20 70 43 75 72 29 29 0a 20 20 20  Root, pCur)).   
35930 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
35940 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35950 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
35960 50 61 67 65 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Page)).   || SQL
35970 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 63 6c  ITE_OK!=(rc = cl
35980 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
35990 43 65 6c 6c 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Cell)).   || SQL
359a0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 64 72  ITE_OK!=(rc = dr
359b0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  opCell(pPage, iC
359c0 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53 69 7a 65  ellIdx, cellSize
359d0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
359e0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
359f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
35a00 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 64 65  * If the cell de
35a10 6c 65 74 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f  leted was not lo
35a20 63 61 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  cated on a leaf 
35a30 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
35a40 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75  ursor.  ** is cu
35a50 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
35a60 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20   to the largest 
35a70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73 75 62  entry in the sub
35a80 2d 74 72 65 65 20 68 65 61 64 65 64 0a 20 20 2a  -tree headed.  *
35a90 2a 20 62 79 20 74 68 65 20 63 68 69 6c 64 2d 70  * by the child-p
35aa0 61 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  age of the cell 
35ab0 74 68 61 74 20 77 61 73 20 6a 75 73 74 20 64 65  that was just de
35ac0 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e  leted from an in
35ad0 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65  ternal.  ** node
35ae0 2e 20 54 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  . The cell from 
35af0 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6e 65  the leaf node ne
35b00 65 64 73 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  eds to be moved 
35b10 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  to the internal.
35b20 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20 72 65 70    ** node to rep
35b30 6c 61 63 65 20 74 68 65 20 64 65 6c 65 74 65 64  lace the deleted
35b40 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69 66 28   cell.  */.  if(
35b50 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
35b60 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c  .    MemPage *pL
35b70 65 61 66 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  eaf = pCur->apPa
35b80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
35b90 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
35ba0 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75      Pgno n = pCu
35bb0 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44  r->apPage[iCellD
35bc0 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20  epth+1]->pgno;. 
35bd0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
35be0 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20 70 43 65   *pTmp;..    pCe
35bf0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c  ll = findCell(pL
35c00 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c  eaf, pLeaf->nCel
35c10 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  l-1);.    nCell 
35c20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c  = cellSizePtr(pL
35c30 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  eaf, pCell);.   
35c40 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
35c50 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e 43 65 6c  _SIZE(pBt)>=nCel
35c60 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f 63 61  l );..    alloca
35c70 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
35c80 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20 70 42 74  ;.    pTmp = pBt
35c90 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20  ->pTmpSpace;..  
35ca0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
35cb0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
35cc0 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 2d 3e  gerWrite(pLeaf->
35cd0 70 44 62 50 61 67 65 29 29 20 0a 20 20 20 20 20  pDbPage)) .     
35ce0 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
35cf0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
35d00 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20  Page, iCellIdx, 
35d10 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34  pCell-4, nCell+4
35d20 2c 20 70 54 6d 70 2c 20 6e 29 29 0a 20 20 20 20  , pTmp, n)).    
35d30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
35d40 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 4c  rc = dropCell(pL
35d50 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c  eaf, pLeaf->nCel
35d60 6c 2d 31 2c 20 6e 43 65 6c 6c 29 29 0a 20 20 20  l-1, nCell)).   
35d70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35d80 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
35d90 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20 74 68 65    /* Balance the
35da0 20 74 72 65 65 2e 20 49 66 20 74 68 65 20 65 6e   tree. If the en
35db0 74 72 79 20 64 65 6c 65 74 65 64 20 77 61 73 20  try deleted was 
35dc0 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65 61  located on a lea
35dd0 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20 74 68 65  f page,.  ** the
35de0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 69  n the cursor sti
35df0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 61  ll points to tha
35e00 74 20 70 61 67 65 2e 20 49 6e 20 74 68 69 73 20  t page. In this 
35e10 63 61 73 65 20 74 68 65 20 66 69 72 73 74 0a 20  case the first. 
35e20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61   ** call to bala
35e30 6e 63 65 28 29 20 72 65 70 61 69 72 73 20 74 68  nce() repairs th
35e40 65 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  e tree, and the 
35e50 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69 74 69 6f  if(...) conditio
35e60 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76 65 72 20  n is.  ** never 
35e70 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true..  **.  ** 
35e80 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
35e90 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20  e entry deleted 
35ea0 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e  was on an intern
35eb0 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c 20 74 68  al node page, th
35ec0 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20 69 73 20  en.  ** pCur is 
35ed0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
35ee0 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 77  leaf page from w
35ef0 68 69 63 68 20 61 20 63 65 6c 6c 20 77 61 73 20  hich a cell was 
35f00 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20  removed to.  ** 
35f10 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c 6c  replace the cell
35f20 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
35f30 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  e internal node.
35f40 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c   This is slightl
35f50 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20 61 73  y.  ** tricky as
35f60 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6d   the leaf node m
35f70 61 79 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 2c  ay be underfull,
35f80 20 61 6e 64 20 74 68 65 20 69 6e 74 65 72 6e 61   and the interna
35f90 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20 2a 2a 20  l node may.  ** 
35fa0 62 65 20 65 69 74 68 65 72 20 75 6e 64 65 72 20  be either under 
35fb0 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20  or overfull. In 
35fc0 74 68 69 73 20 63 61 73 65 20 72 75 6e 20 74 68  this case run th
35fd0 65 20 62 61 6c 61 6e 63 69 6e 67 20 61 6c 67 6f  e balancing algo
35fe0 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e 20 74 68  rithm.  ** on th
35ff0 65 20 6c 65 61 66 20 6e 6f 64 65 20 66 69 72 73  e leaf node firs
36000 74 2e 20 49 66 20 74 68 65 20 62 61 6c 61 6e 63  t. If the balanc
36010 65 20 70 72 6f 63 65 65 64 73 20 66 61 72 20 65  e proceeds far e
36020 6e 6f 75 67 68 20 75 70 20 74 68 65 0a 20 20 2a  nough up the.  *
36030 2a 20 74 72 65 65 20 74 68 61 74 20 77 65 20 63  * tree that we c
36040 61 6e 20 62 65 20 73 75 72 65 20 74 68 61 74 20  an be sure that 
36050 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69 6e 20 74  any problem in t
36060 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
36070 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63   has.  ** been c
36080 6f 72 72 65 63 74 65 64 2c 20 73 6f 20 62 65 20  orrected, so be 
36090 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  it. Otherwise, a
360a0 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 74  fter balancing t
360b0 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c 0a 20 20  he leaf node,.  
360c0 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63 75 72 73  ** walk the curs
360d0 6f 72 20 75 70 20 74 68 65 20 74 72 65 65 20 74  or up the tree t
360e0 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  o the internal n
360f0 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20  ode and balance 
36100 69 74 20 61 73 20 0a 20 20 2a 2a 20 77 65 6c 6c  it as .  ** well
36110 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 62 61 6c  .  */.  rc = bal
36120 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 69 66  ance(pCur);.  if
36130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36140 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 69  && pCur->iPage>i
36150 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20 20  CellDepth ){.   
36160 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50   while( pCur->iP
36170 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29  age>iCellDepth )
36180 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
36190 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
361a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
361b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
361c0 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
361d0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
361e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
361f0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
36200 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
36210 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
36220 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20 74  te a new BTree t
36230 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74  able.  Write int
36240 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70  o *piTable the p
36250 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
36260 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
36270 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
36280 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65  ..**.** The type
36290 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74 65   of type is dete
362a0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c  rmined by the fl
362b0 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20  ags parameter.  
362c0 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  Only the.** foll
362d0 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20  owing values of 
362e0 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65 6e  flags are curren
362f0 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68  tly in use.  Oth
36300 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a  er values for.**
36310 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74   flags might not
36320 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   work:.**.**    
36330 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54   BTREE_INTKEY|BT
36340 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20  REE_LEAFDATA    
36350 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61   Used for SQL ta
36360 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20  bles with rowid 
36370 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45  keys.**     BTRE
36380 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20  E_ZERODATA      
36390 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64              Used
363a0 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73   for SQL indices
363b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
363c0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
363d0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
363e0 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
363f0 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  s){.  BtShared *
36400 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
36410 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
36420 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b    Pgno pgnoRoot;
36430 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
36440 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
36450 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
36460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
36470 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
36480 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
36490 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
364a0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66  readOnly );..#if
364b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
364c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20  AUTOVACUUM.  rc 
364d0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
364e0 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c  age(pBt, &pRoot,
364f0 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30   &pgnoRoot, 1, 0
36500 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
36510 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36520 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  }.#else.  if( pB
36530 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
36540 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
36550 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
36560 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
36570 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
36580 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
36590 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
365a0 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
365b0 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
365c0 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69  /..    /* Creati
365d0 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d  ng a new table m
365e0 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75  ay probably requ
365f0 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78  ire moving an ex
36600 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a  isting database.
36610 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72      ** to make r
36620 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20  oom for the new 
36630 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65  tables root page
36640 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70  . In case this p
36650 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a  age turns.    **
36660 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76   out to be an ov
36670 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c  erflow page, del
36680 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  ete all overflow
36690 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73   page-map caches
366a0 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20  .    ** held by 
366b0 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20  open cursors..  
366c0 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64    */.    invalid
366d0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
366e0 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f  che(pBt);..    /
366f0 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  * Read the value
36700 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d   of meta[3] from
36710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
36720 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65   determine where
36730 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
36740 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
36750 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f   table should go
36760 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65  . meta[3] is the
36770 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
36780 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  ge.    ** create
36790 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65  d so far, so the
367a0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69   new root-page i
367b0 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20  s (meta[3]+1).. 
367c0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
367d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
367e0 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47  ta(p, BTREE_LARG
367f0 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26  EST_ROOT_PAGE, &
36800 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
36810 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36820 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
36830 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
36840 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20  gnoRoot++;..    
36850 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d  /* The new root-
36860 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
36870 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70  allocated on a p
36880 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
36890 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50   or the.    ** P
368a0 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65  ENDING_BYTE page
368b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
368c0 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  le( pgnoRoot==PT
368d0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
368e0 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
368f0 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
36900 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
36910 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
36920 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
36930 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
36940 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
36950 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
36960 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
36970 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
36980 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
36990 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
369a0 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
369b0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
369c0 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
369d0 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
369e0 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
369f0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
36a00 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
36a10 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
36a20 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
36a30 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
36a40 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
36a50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36a60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
36a70 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
36a80 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
36a90 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
36aa0 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  /* pgnoRoot is t
36ab0 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  he page that wil
36ac0 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
36ad0 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20  e root-page of. 
36ae0 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
36af0 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20  table (assuming 
36b00 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74  an error did not
36b10 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20   occur). But we 
36b20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  were.      ** al
36b30 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65  located pgnoMove
36b40 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69  . If required (i
36b50 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f  .e. if it was no
36b60 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  t allocated.    
36b70 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e    ** by extendin
36b80 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65  g the file), the
36b90 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74   current page at
36ba0 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f   position pgnoMo
36bb0 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  ve.      ** is a
36bc0 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64  lready journaled
36bd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36be0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
36bf0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
36c00 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
36c10 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a  ge(pPageMove);..
36c20 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68        /* Move th
36c30 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
36c40 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20   at pgnoRoot to 
36c50 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20  pgnoMove. */.   
36c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
36c70 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
36c80 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
36c90 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
36ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36cb0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
36cc0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
36cd0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
36ce0 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
36cf0 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
36d00 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
36d10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
36d20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
36d30 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
36d40 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
36d50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
36d60 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
36d70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
36d80 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
36d90 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
36da0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
36db0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
36dc0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
36dd0 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
36de0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
36df0 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
36e00 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
36e10 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
36e20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
36e30 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
36e40 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
36e50 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
36e60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
36e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36e80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
36ea0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
36eb0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
36ec0 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
36ed0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
36ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36ef0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
36f10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36f20 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
36f30 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
36f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36f50 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
36f60 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
36f70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
36f90 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
36fa0 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
36fb0 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
36fc0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
36fd0 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
36fe0 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
36ff0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
37000 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
37010 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
37020 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
37030 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
37040 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
37050 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
37060 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37070 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
37080 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
37090 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
370a0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
370b0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
370c0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
370d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
370e0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
370f0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
37100 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
37110 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
37120 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
37130 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37140 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
37150 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
37160 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37170 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
37180 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
37190 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
371a0 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
371b0 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
371c0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
371d0 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
371e0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
371f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
37200 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
37210 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
37220 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
37230 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
37240 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
37250 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
37260 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65  .  rc = btreeCre
37270 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61  ateTable(p, piTa
37280 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73  ble, flags);.  s
37290 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
372a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
372b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
372c0 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
372d0 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  ase page and all
372e0 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20   its children.  
372f0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61  Return.** the pa
37300 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
37310 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
37320 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  t clearDatabaseP
37330 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
37340 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
37350 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
37360 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
37370 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
37380 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
37390 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
373a0 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74  o clear */.  int
373b0 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20   freePageFlag,  
373c0 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
373d0 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
373e0 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65  .  int *pnChange
373f0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
37400 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
37410 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
37420 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
37430 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
37440 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
37450 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
37460 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67  ;.  if( pgno>pag
37470 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
37480 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
37490 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
374a0 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
374b0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
374c0 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
374d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
374e0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
374f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
37500 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
37510 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
37520 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
37530 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
37540 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
37550 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
37560 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
37570 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
37580 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  ell), 1, pnChang
37590 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
375a0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
375b0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
375c0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c     }.    rc = cl
375d0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
375e0 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
375f0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
37600 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
37610 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
37620 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
37630 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
37640 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
37650 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
37660 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  [8]), 1, pnChang
37670 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
37680 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
37690 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
376a0 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67  else if( pnChang
376b0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
376c0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
376d0 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20  ;.    *pnChange 
376e0 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  += pPage->nCell;
376f0 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
37700 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
37710 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
37720 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
37730 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
37740 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
37750 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
37760 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
37770 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
37780 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
37790 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
377a0 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
377b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
377c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
377d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
377e0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
377f0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
37800 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
37810 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
37820 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
37830 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
37840 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
37850 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
37860 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
37870 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
37880 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
37890 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
378a0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
378b0 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
378c0 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
378d0 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
378e0 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
378f0 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
37900 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
37910 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
37920 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
37930 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  able..**.** If p
37940 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e  nChange is not N
37950 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20  ULL, then table 
37960 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  iTable must be a
37970 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20  n intkey table. 
37980 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76  The.** integer v
37990 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  alue pointed to 
379a0 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69  by pnChange is i
379b0 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
379c0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
379d0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61  ntries in the ta
379e0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
379f0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
37a00 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
37a10 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e   iTable, int *pn
37a20 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72  Change){.  int r
37a30 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
37a40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
37a50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
37a60 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
37a70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
37a80 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
37a90 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65  (rc = checkForRe
37aa0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
37ab0 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53  Table, 0, 1))!=S
37ac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37ad0 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
37ae0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
37af0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
37b00 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
37b10 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
37b20 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
37b30 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
37b40 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
37b50 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
37b60 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
37b70 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b  e, 0, pnChange);
37b80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
37b90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
37ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37bb0 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
37bc0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
37bd0 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
37be0 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
37bf0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
37c00 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
37c10 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
37c20 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
37c30 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
37c40 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
37c50 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
37c60 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
37c70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
37c80 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
37c90 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
37ca0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63  re any open.** c
37cb0 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
37cc0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  ble..**.** If AU
37cd0 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
37ce0 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  led and the page
37cf0 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f   at iTable is no
37d00 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  t the last.** ro
37d10 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
37d20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
37d30 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  en the last root
37d40 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65   page .** in the
37d50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
37d60 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  s moved into the
37d70 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
37d80 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54  ccupied by.** iT
37d90 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61  able and that la
37da0 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  st slot formerly
37db0 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65   occupied by the
37dc0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a   last root page.
37dd0 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
37de0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74  he freelist inst
37df0 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20  ead of iTable.  
37e00 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c  In this say, all
37e10 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61  .** root pages a
37e20 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62  re kept at the b
37e30 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
37e40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
37e50 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73  hich.** is neces
37e60 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43  sary for AUTOVAC
37e70 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68  UUM to work righ
37e80 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  t.  *piMoved is 
37e90 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  set to the .** p
37ea0 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
37eb0 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  used to be the l
37ec0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ast root page in
37ed0 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
37ee0 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49  .** the move.  I
37ef0 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d  f no page gets m
37f00 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69  oved, *piMoved i
37f10 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54  s set to 0..** T
37f20 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
37f30 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  e is recorded in
37f40 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65   meta[3] and the
37f50 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74   value of.** met
37f60 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20  a[3] is updated 
37f70 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
37f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
37f90 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
37fa0 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
37fb0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
37fc0 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
37fd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
37fe0 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
37ff0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
38000 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
38010 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
38020 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
38030 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
38040 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20  ANS_WRITE );..  
38050 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
38060 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
38070 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
38080 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
38090 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
380a0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
380b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
380c0 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
380d0 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
380e0 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
380f0 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
38100 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
38110 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
38120 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
38130 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
38140 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
38150 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
38160 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
38170 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
38180 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
38190 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
381a0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
381b0 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d  pCursor->pBtree-
381c0 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
381d0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
381e0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
381f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
38200 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
38210 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
38220 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
38230 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
38240 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
38250 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
38260 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
38270 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
38280 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
38290 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
382a0 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
382b0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
382c0 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
382d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
382e0 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
382f0 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
38300 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
38310 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
38320 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
38330 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
38340 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
38350 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
38360 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
38370 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53  (p, BTREE_LARGES
38380 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 6d 61  T_ROOT_PAGE, &ma
38390 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
383a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
383b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
383c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
383d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
383e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
383f0 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
38400 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
38410 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
38420 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
38430 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
38440 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
38450 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
38460 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
38470 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
38480 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
38490 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
384a0 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
384b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
384c0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
384d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
384e0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
384f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
38500 45 5f 4f 4b 20 29 7b